【发布时间】:2012-09-09 05:13:34
【问题描述】:
有时事件模式被用于在 MVVM 应用程序中引发事件,或者子视图模型以像这样松散耦合的方式向其父视图模型发送消息。
父视图模型
searchWidgetViewModel.SearchRequest += (s,e) =>
{
SearchOrders(searchWidgitViewModel.SearchCriteria);
};
SearchWidget 视图模型
public event EventHandler SearchRequest;
SearchCommand = new RelayCommand(() => {
IsSearching = true;
if (SearchRequest != null)
{
SearchRequest(this, EventArgs.Empty);
}
IsSearching = false;
});
在为 .NET4.5 重构我的应用程序时,我正在制作尽可能多的代码以使用 async 和 await。但是以下不起作用(我真的没想到)
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";
}
我发现的关于异步引发事件的任何东西isancient,但我在框架中找不到支持这一点的东西。
我如何await 调用一个事件但仍保留在 UI 线程上。
【问题讨论】:
-
“不起作用”是什么意思?
-
它无法编译。你不能等待返回 void 的东西
-
您真的需要等到所有处理程序完成吗?您不能直接启动它们并让它们的
async部分完成而不等待它们吗? -
微软现在在Microsoft.VisualStudio.Threading 包中提供了一个
AsyncEventHandler
标签: c# events mvvm .net-4.5 async-await