我对异步编程的全部“全程下降”哲学完全失望。但是,.Net中有很多地方,您根本无法控制调用签名。事件处理程序浮现在脑海。事件处理程序没有返回类型(毕竟是事件):
public event EventHandler ThresholdReached;
protected virtual void OnThresholdReached(EventArgs e)
{
Task.Run(async () => await Task.Delay(0).ConfigureAwait(false));
}
如果使用此模式,则分析器会标记为应通过使用await观察等待状态。这不是处理程序中的选项。所以我尝试了这种模式:
protected virtual void OnThresholdReached(EventArgs e)
{
Task.Run(async () => await Task.Delay(0).ConfigureAwait(false)).Wait();
}
有人告诉我,等待同步任务会导致死锁。有人建议使用“ JoinableTaskFactory.Run”,但这是在Visual Studio程序包中的,我不打算为应该作为核心方法的东西而引入其他程序包。
那么在事件处理程序中处理长时间运行的任务的最佳实践是什么?