等待事件处理程序

时间:2014-03-20 03:46:26

标签: c# .net events async-await

所以这里有删除和事件

public delegate Task SomeEventHandler(SomeEventArgs e);

...


public event SomeEventHandler OnSomething;

订阅者(多个)

some.OnSomething += DoSomething;

...

public async Task DoSomething(SomeEventArgs e) {
    await SomethingElse();
    e.A = true;
}

事件致电

if (this.OnSomething != null)
    await this.OnSomething(args);

// Here args.A is false
// It should be true

问题是,即使DoSomething尚未完成,最后一部分仍会继续。会出现什么问题?

1 个答案:

答案 0 :(得分:10)

这里的问题是SomeEventHandler的多个实例正在运行,因此创建了多个Task值。 await调用仅在其中一个上运行,因此它是否有可能是最终等待的DoSomething方法。

要解决此问题,您需要在await创建的每个Task值上if (this.OnSomething != null) { foreach (var d in this.OnSomething.GetInvocationList().Cast<SomeEventHandler>()) { await d(args); } ]

{{1}}
相关问题