繁体   English   中英

将异步结果返回给事件

[英]Return async result to an event

假设我有和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之后的部分 - 在线程await Task.Delay而不是原始UI线程上运行。

我假设您有一些使用async的原因,而不是仅仅编写CreateControl的同步版本。 这不仅是更简单的代码,它还将使用原始(UI)线程来完成工作,而不是在UI线程等待它时使用第二个线程。

另请注意,应始终防止async void方法抛出异常 - 请参阅此处接受的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM