c# - 将异步结果返回给事件

标签 c# events asynchronous return

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

最佳答案

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

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

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

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

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

关于c# - 将异步结果返回给事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17754446/

相关文章:

c# - 等待无效的异步方法

C# 如何在双击时选择文本框中的所有文本?

c# - 检查 TreeView 是否有变化?

objective-c - 在 objective-C 中拦截按钮的事件到 PDF

C# 套接字 : synchronous calls within asynchronous ones

javascript - 多次重复使用 Deferred

c# - 具有不同文件的 LINQ to XML

c# - 我如何模拟 Elmah 的 ErrorSignal 例程?

javascript - 如何检查是否通过 java 脚本打开浏览器搜索(使用 Ctrl+F)选项?

python - 手动触发ttk笔记本选项卡更改事件