我有一个问题如何在 WPF 生命周期方法(使用 Caliburn-Micro 框架)中等待异步方法(例如 OnActivate、OnInitialized、OnExit - 它直接绑定到Application.Exit事件)
这篇文章准确地描述了我的问题: http: //mark.mymonster.nl/2013/07/10/donrsquot-make-your-application-lifetime-events-async-void(现在我正在考虑使用本文中的解决方案,但乍一看似乎有点矫枉过正)
我需要在我的 OnExit 处理程序中等待一些异步方法,所以我将它作为异步。它有效。有点儿。我不明白为什么?,但是在调用 Application.Exit 事件时,它会以某种方式等待方法完成,即使处理程序是异步无效的。你能解释一下这是怎么可能的吗?这安全吗?还是只是巧合?Async void 应该只用于顶级事件,是这种情况吗?
我查看了系统的代码。绑定看起来像这样:
public event EventHandler Exit
{
add
{
XcpImports.CheckThread();
this.AddEventListener(DependencyProperty.RegisterCoreProperty(20053U, (Type) null), (Delegate) value);
}
remove
{
XcpImports.CheckThread();
this.RemoveEventListener(DependencyProperty.RegisterCoreProperty(20053U, (Type) null), (Delegate) value);
}
}
这真的很神秘,我无法通过调用此事件来了解 .net 框架中真正发生的事情。
同样奇怪的是,当我不使用ConfigureAwait(false)时,在处理程序中调用await Task.Delay(1)会导致死锁。所以我会说.Wait()在 .net 代码的深处使用。
注意:当我使 OnActivate、OnInitialized 处理程序异步时,正如预期的那样,页面不会等待处理程序完成。
谢谢你的回答!