等待事件处理程序
本文关键字:程序 事件处理 等待 | 更新日期: 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);
}
]