我有以下问题:我需要将一个异步方法绑定到Window。闭幕式。由于Closing事件需要一个具有void签名的CancelEventHandler,所以我的WindowClosing方法不能是Task类型。所以我有这个:
public void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
DeinitializeThisFirst();
DeinitializeThisAfterwards();
}
由于硬件原因,在调用DeinitializeHisAfterwards()之前,DeinitialiseHisFirst()必须完成。但是DeinitializeHisFirst()是一个不可行的任务。由于我无法将Window_Closing的签名更改为Task,因此无法执行以下操作:
public async Task Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
await DeinitializeThisFirst();
DeinitializeThisAfterwards();
}
由于我在UI线程上,这将导致死锁:
public void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
DeinitializeThisFirst().ConfigureAwait(false).GetAwaiter().GetResult();
DeinitializeThisAfterwards();
}
在单独的Task中执行它将导致DeinitializeHisAfterwards()提前执行:
public void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Task.Run(async () => await DeinitializeThisFirst());
DeinitializeThisAfterwards();
}
将其包装在ContinueWith()中将防止两者都被执行,因为窗口会立即关闭:
public void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
DeinitializeThisFirst().ContinueWith(_ =>
{
DeinitializeThisAfterwards();
});
}
我在这里不知所措。有人能帮忙吗?