Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理在异步void事件处理程序完成之前progeam需要退出的情况?_C# - Fatal编程技术网

C# 如何处理在异步void事件处理程序完成之前progeam需要退出的情况?

C# 如何处理在异步void事件处理程序完成之前progeam需要退出的情况?,c#,C#,根据MSDN,事件处理程序是异步void唯一可接受的用法。但是如何处理在异步void事件处理程序完成之前progeam需要退出的情况呢 我尝试了一个WPF应用程序,在异步事件处理程序的等待行之后,程序似乎没有执行任何代码就退出了。这意味着可能会绕过一些清除代码,系统可能处于无效状态 我在谷歌上搜索了很多,但从未看到任何评论说“如果需要清理,请不要使用异步事件处理程序”或类似的内容。这是一个大家都知道的非常基本的含义吗 如果这是一个愚蠢的问题,请原谅,因为我是C#world的新手。如果异步事件处理

根据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应该在异步文档中提到这一点。