C# 将异步结果返回到事件

C# 将异步结果返回到事件,c#,events,asynchronous,return,C#,Events,Asynchronous,Return,假设我有一个API事件,我必须返回一个结果。 我必须执行的计算使用异步方法,该方法创建一个控件(必须在UI线程上运行) private async void API\u QueryControl(对象发送方,APIEventArgs e) { e、 结果=等待CreateControl(); } 专用异步任务CreateControl() { 等待任务。延迟(1000); 返回新面板(); } 现在,这显然行不通,因为API_QueryControl在我设置结果之前生成。我无法控制API,这意

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

private async void API\u QueryControl(对象发送方,APIEventArgs e)
{
e、 结果=等待CreateControl();
}
专用异步任务CreateControl()
{
等待任务。延迟(1000);
返回新面板();
}
现在,这显然行不通,因为API_QueryControl在我设置结果之前生成。我无法控制API,这意味着事件无法更改。如何让事件等待结果?

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

e.Result = await CreateControl().ConfigureAwait(false);
ConfigureAwait(false)使CreateControl的继续部分(在
等待任务之后的部分)在线程池而不是原始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();
}
我假设您有理由这样使用异步,而不是编写CreateControl的同步版本。这不仅是更简单的代码,它还将使用原始(UI)线程来完成工作,而不是在UI线程等待时使用第二个线程


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

您没有。您可以阻止UI线程,更改或不使用该方法,找到一种更快的方法来计算值,等等。我如何通过阻止UI线程使其工作?CreateControl().Result、CreateControl().Wait()等会导致死锁。在这种情况下,阻止UI线程的一种方法是不使用异步…;-)