等待事件处理程序

本文关键字:程序 事件处理 等待 | 更新日期: 2023-09-27 17:51:05

这里是委托和事件

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没有完成,最后一部分仍在继续。问题是什么?

等待事件处理程序

这里的问题是SomeEventHandler的多个实例正在运行,因此有多个Task值正在创建。await调用只在其中一个上运行,因此它在某种程度上取决于是否最终等待的DoSomething方法。

要解决这个问题,您需要在每个创建的Task值上设置await

if (this.OnSomething != null) {
  foreach (var d in this.OnSomething.GetInvocationList().Cast<SomeEventHandler>()) {
    await d(args);
  }
]