C# 如何处理在异步void事件处理程序完成之前progeam需要退出的情况?
根据MSDN,事件处理程序是异步void唯一可接受的用法。但是如何处理在异步void事件处理程序完成之前progeam需要退出的情况呢 我尝试了一个WPF应用程序,在异步事件处理程序的等待行之后,程序似乎没有执行任何代码就退出了。这意味着可能会绕过一些清除代码,系统可能处于无效状态 我在谷歌上搜索了很多,但从未看到任何评论说“如果需要清理,请不要使用异步事件处理程序”或类似的内容。这是一个大家都知道的非常基本的含义吗 如果这是一个愚蠢的问题,请原谅,因为我是C#world的新手。如果异步事件处理程序正在运行,您可以订阅事件并将C# 如何处理在异步void事件处理程序完成之前progeam需要退出的情况?,c#,C#,根据MSDN,事件处理程序是异步void唯一可接受的用法。但是如何处理在异步void事件处理程序完成之前progeam需要退出的情况呢 我尝试了一个WPF应用程序,在异步事件处理程序的等待行之后,程序似乎没有执行任何代码就退出了。这意味着可能会绕过一些清除代码,系统可能处于无效状态 我在谷歌上搜索了很多,但从未看到任何评论说“如果需要清理,请不要使用异步事件处理程序”或类似的内容。这是一个大家都知道的非常基本的含义吗 如果这是一个愚蠢的问题,请原谅,因为我是C#world的新手。如果异步事件处理
e.Cancel
设置为true
public partial class MainWindow : Window
{
//Flag indicating async operation is in progress
private bool m_EventHandlerIsRunning = false;
public MainWindow()
{
InitializeComponent();
}
// Subscribe this method to MainWindow's Closing event
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// Forbid MainWindow to close, if async event handler is running
e.Cancel = m_EventHandlerIsRunning;
}
// You will have to include following in all async event handlers
private async void Button_Click(object sender, RoutedEventArgs e)
{
try
{
// Forbid MainWindow to be closed
m_EventHandlerIsRunning = true;
// Do something async
await Task.Delay(1000);
}
finally
{
// Let MainWindow to be closed
m_EventHandlerIsRunning = false;
}
}
}
但无论如何,您的应用程序必须能够从此类情况(未执行清理代码)中恢复,因为您无法防止随时发生的操作系统崩溃或断电。如果异步事件处理程序正在运行,您可以订阅事件并将e.Cancel
设置为true
public partial class MainWindow : Window
{
//Flag indicating async operation is in progress
private bool m_EventHandlerIsRunning = false;
public MainWindow()
{
InitializeComponent();
}
// Subscribe this method to MainWindow's Closing event
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// Forbid MainWindow to close, if async event handler is running
e.Cancel = m_EventHandlerIsRunning;
}
// You will have to include following in all async event handlers
private async void Button_Click(object sender, RoutedEventArgs e)
{
try
{
// Forbid MainWindow to be closed
m_EventHandlerIsRunning = true;
// Do something async
await Task.Delay(1000);
}
finally
{
// Let MainWindow to be closed
m_EventHandlerIsRunning = false;
}
}
}
但无论如何,您的应用程序必须能够从此类情况(未执行清理代码)中恢复,因为您无法防止随时可能发生的操作系统崩溃或断电。一点也不愚蠢,但可能已经有了答案。你能在你的问题中加入一些代码,这样我们就可以看到你实际上在尝试什么了吗?是什么引起了这一事件?同时主线上发生了什么?@dlatikay非常感谢您的快速回答。这是一个一般性的问题,所以我还没有我的代码。我用了这个例子,这个例子一点也不愚蠢,但可能已经有了答案。你能在你的问题中加入一些代码,这样我们就可以看到你实际上在尝试什么了吗?是什么引起了这一事件?同时主线上发生了什么?@dlatikay非常感谢您的快速回答。这是一个一般性的问题,所以我还没有我的代码。我用了这个例子,这个例子来自感谢你的回答。这似乎是一个可以接受的解决办法。所以我能说这是必须考虑而不是忽视的事情吗?MSDN应该在异步文档中提到这一点。感谢您的回答。这似乎是一个可以接受的解决办法。所以我能说这是必须考虑而不是忽视的事情吗?MSDN应该在异步文档中提到这一点。