向事件返回异步结果

本文关键字:结果 异步 返回 事件 | 更新日期: 2023-09-27 18:23:55

假设我有一个API事件,在那里我必须返回一个结果。我必须进行的计算使用了一个异步方法,该方法创建了一个控件(必须在UI线程上运行)。

private async void API_QueryControl(object sender, APIEventArgs e)
{
e.Result = await CreateControl();
}
private async Task<Control> CreateControl()
{
await Task.Delay(1000);
return new Panel();
}

现在,这显然不起作用,因为API_QueryControl在我设置结果之前就产生了。我无法控制API,这意味着事件无法更改。我该如何让活动等待结果?

向事件返回异步结果

您可以使用ConfigureAwait(false)阻止当前(UI)线程,但避免死锁。像这样:

e.Result = await CreateControl().ConfigureAwait(false);

ConfigureAwait(false)使CreateControl的延续部分(await Task.Delay之后的部分)在线程池上运行,而不是在原始UI线程上运行。

我认为您有理由使用这样的异步,而不是仅仅编写CreateControl的同步版本。这不仅是更简单的代码,它还将使用原始(UI)线程来完成工作,而不是在UI线程等待时使用第二个线程

还要注意,您应该始终防止从async void方法抛出异常——请参阅此处的接受答案。