Basé sur PublishOnUIThreadAsync
méthode d'extension, qui renvoie une tâche
/// <summary>
/// Publishes a message on the UI thread asynchrone.
/// </summary>
/// <param name="eventAggregator">The event aggregator.</param>
/// <param name="message">The message instance.</param>
public static Task PublishOnUIThreadAsync(this IEventAggregator eventAggregator, object message) {
Task task = null;
eventAggregator.Publish(message, action => task = action.OnUIThreadAsync());
return task;
}
Vous remarquerez que le groupe est affecté au sein de l'action en cours d'exécution par Publish
. Vous devez appeler l'action pour que la tâche soit assignée en vous assurant que le délégué/action est appelé. Vous pouvez le faire dans un rappel de la méthode simulée.
L'exemple minimal suivant montre comment procéder. Notez comment Publish
est configuré avec le rappel pour appeler l'argument Passé dans Action.
[TestClass]
public class MyTestClass {
[TestMethod]
public async Task _EventAggregator_Should_Publish_OnUIThread() {
//Arrange
MyEvent navigateEvent = null;
var eventAggregatorMock = new Mock<IEventAggregator>();
eventAggregatorMock
.Setup(x => x.Publish(It.IsAny<MyEvent>(), It.IsAny<Action<System.Action>>()))
.Callback((object message, Action<System.Action> marshal) => {
navigateEvent = (MyEvent)message;
marshal(() => { });//Invoking action that would cause task to be assigned
});
var sut = new MyClass(eventAggregatorMock.Object);
//Act
await sut.Navigate();
//Assert
navigateEvent.Should().NotBeNull();
eventAggregatorMock.Verify(_ => _.Publish(It.IsAny<MyEvent>(),
It.IsAny<Action<System.Action>>()), Times.Once);
}
public class MyEvent {
private int p;
public MyEvent(int p) {
// TODO: Complete member initialization
this.p = p;
}
}
public class MyClass {
IEventAggregator eventAggregator;
public MyClass(IEventAggregator eventAggregator) {
this.eventAggregator = eventAggregator;
}
public async Task Navigate() {
await eventAggregator.PublishOnUIThreadAsync(new MyEvent(5));
}
}
}
Qu'est-ce qui ne fonctionne pas exactement? –
Quelle est l'erreur que vous avez rencontrée? Il est également supposé que vous avez fourni une configuration pour la méthode en question. – Nkosi