【发布时间】:2021-07-29 04:18:36
【问题描述】:
我有一个 ASP.NET MVC/WebAPI 应用程序,其中域逻辑在某些情况下依赖于事件来解耦关注点。避免在事件处理程序中使用异步方法变得越来越困难,但由于这是一个 Web 应用程序,我想避免使用 async void,因为这些不是我们正在处理的顶级事件。我见过一些似乎过于复杂的解决方案来处理这个问题——我想保持这个简单的解决方案。我的解决方案是放弃 EventHandler 代表并使用返回 Task 的 Func 代替,例如:
public event EventHandler<MyEventArgs> SomethingHappened;
将被重构为:
public event Func<object, MyEventArgs, Task> SomethingHappened;
所以在我的代码中我可以这样做:
if (SomethingHappened != null)
{
await SomethingHappened.Invoke(this, new MyEventArgs());
}
我们是唯一使用这些项目的人,因此使用EventHandler 的标准约定并不是绝对必要的。虽然使用这种模式意味着知道处理程序是异步的,但我不确定这一定是一件坏事,因为越来越多的库正在放弃它们的同步 API 方法,或者根本不包括它们。在某种程度上,我很惊讶这在 .NET 中作为一流的概念不被支持,因为 async/await 在 Web 应用程序常用的许多库中变得越来越普遍。
这似乎是一个优雅的解决方案。我已经在具有多个事件订阅者的真实应用程序中对此进行了测试,每个处理程序具有不同的延迟,Invoke() 等待它们。然而,这感觉就像一个陷阱。我错过了什么?
【问题讨论】:
标签: c# asp.net .net async-await event-handling