gpt4 book ai didi

c# - 等待异步事件处理程序不等待方法继续

转载 作者:太空宇宙 更新时间:2023-11-03 22:43:13 24 4
gpt4 key购买 nike

我正在开发一个 WinForms 应用程序。我创建了一个自定义控件(继承自 Control 类)。它有自己的事件处理程序,允许表单观察一些事件。

public  event EventHandler<TextBoxFilterEventArgs> DataGetFiltered;

我的问题出现在控件内部,在某些特定情况下我对已注册的接收者执行调用:

this.Enabled=false;
if (DataGetFiltered != null)
DataGetFiltered(this, new TextBoxFilterEventArgs(itemsFiltered));
this.Enabled=true;

您可以看到我在调用之前和之后将控件设置为禁用/启用。包含控件的表单正在以异步方式向该事件注册一些方法:

txtFilter.DataGetFiltered += async (s, e) => await txtFilterByDesc_DataGetFiltered(s, e);

private async Task txtFilterByDesc_DataGetFiltered(object sender, TextBoxFilterEventArgs e)
{
await Task.Run(()=>/*some code*/);
}

会发生什么?控件调用已注册的事件处理程序,但它继续运行 this.Enabled=true; 而无需等待先前的调用完成(但它已被等待!)这是怎么回事?

最佳答案

What happens?

禁用控件后,您的事件处理代码运行异步委托(delegate)。
代表最终调用Task.Run并将一些工作卸载到线程池线程。然后委托(delegate)返回,控件再次启用,但计划任务仍在后台运行。

The control is a textbox that i want to get enabled/disabled during the handling of eventhandlers. I have to move that logic to the handler itself?

简短的回答:是的。

更详细的答案:当您使用标准 .NET 事件处理模式时,您必须将此逻辑移至事件处理程序中。事件不知道处理程序的实现。它们可以是同步的,也可以是异步的。所以,你所能做的就是让事件处理程序来管理Enabled属性(property)。

从技术上讲,您可以发明某种异步事件处理程序,但实际上,您不应该这样做。 .NET 开发人员知道,事件委托(delegate)的类型是 EventHandler/EventHandler<T> .自定义事件委托(delegate)类型打破了众所周知的模式。

关于c# - 等待异步事件处理程序不等待方法继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51243764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com