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,这意味着无法更改事件。我如何让事件等待结果?

4

1 回答 1

0

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

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

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

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

另请注意,您应该始终防止从方法中引发异常- 请参阅此处async void接受的答案。

于 2013-09-05T23:41:07.390 回答