gpt4 book ai didi

c# - 如何在 'await' 引发 EventHandler 事件

转载 作者:IT王子 更新时间:2023-10-29 03:57:24 25 4
gpt4 key购买 nike

有时,事件模式用于通过或 subview 模型在 MVVM 应用程序中引发事件,以像这样松散耦合的方式将消息发送到其父 View 模型。

父 View 模型

searchWidgetViewModel.SearchRequest += (s,e) => 
{
SearchOrders(searchWidgitViewModel.SearchCriteria);
};

SearchWidget ViewModel

public event EventHandler SearchRequest;

SearchCommand = new RelayCommand(() => {

IsSearching = true;
if (SearchRequest != null)
{
SearchRequest(this, EventArgs.Empty);
}
IsSearching = false;
});

在为 .NET4.5 重构我的应用程序时,我正在编写尽可能多的代码以使用 asyncawait。但是以下不起作用(我真的没想到它会起作用)

 await SearchRequest(this, EventArgs.Empty);

框架确实这样做是为了调用事件处理程序 such as this ,但我不确定它是如何做到的?

private async void button1_Click(object sender, RoutedEventArgs e)
{
textBlock1.Text = "Click Started";
await DoWork();
textBlock2.Text = "Click Finished";
}

我发现的关于异步引发事件的任何内容 is ancient但我在框架中找不到支持这一点的东西。

我怎样才能等待事件的调用但仍然在 UI 线程上。

最佳答案

编辑:这对多个订阅者来说效果不佳,因此除非您只有一个订阅者,否则我不建议您使用它。


感觉有点老套——但我从来没有发现更好的东西:

声明一个委托(delegate)。这与 EventHandler 相同但返回一个任务而不是 void

public delegate Task AsyncEventHandler(object sender, EventArgs e);

然后您可以运行以下命令,只要在父级中声明的处理程序正确使用 asyncawait ,那么它将异步运行:

if (SearchRequest != null) 
{
Debug.WriteLine("Starting...");
await SearchRequest(this, EventArgs.Empty);
Debug.WriteLine("Completed");
}

样本处理器:

 // declare handler for search request
myViewModel.SearchRequest += async (s, e) =>
{
await SearchOrders();
};

注意:我从未对多个订阅者进行过测试,也不确定这将如何工作 - 所以如果您需要多个订阅者,请务必仔细测试。

关于c# - 如何在 'await' 引发 EventHandler 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451609/

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