2013-07-19 63 views
3

假设我有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,这意味着该事件无法更改。我将如何获得该事件以等待结果?

+2

你不知道。您可以阻止UI线程,更改或不使用该方法,找到计算值的更快捷方式等。 – Servy

+0

如何通过阻止UI线程使其工作? CreateControl()。Result,CreateControl()。Wait()等会导致死锁。 – user2533483

+0

在这种情况下阻止UI线程的一种方法是不使用异步... ;-) –

回答

0

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

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

ConfigureAwait(假),使CreateControl的延续部分 - 一部分await Task.Delay后 - 在线程池,而不是原来的UI线程中运行。

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

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

相关问题