Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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# 处理未处理的异常后,应用程序进入未知/锁定状态_C#_Wpf_Unhandled Exception - Fatal编程技术网

C# 处理未处理的异常后,应用程序进入未知/锁定状态

C# 处理未处理的异常后,应用程序进入未知/锁定状态,c#,wpf,unhandled-exception,C#,Wpf,Unhandled Exception,在我的App.xaml.cs中,我有事件要处理DispatcherUnhandledException(UI线程)和UnhandledException(非UI线程)。当我在dispatcher.Invoke中抛出异常时,dispatcherhandler捕获并处理该异常。在记录异常后,我将e.Handled设置为true。现在奇怪的行为是,如果我将异常抛出dispatcher.Invoke之外,作为一个常规语句,控制被发送到dispatcher异常处理程序,但在处理该方法后,应用程序基本上失去

在我的App.xaml.cs中,我有事件要处理DispatcherUnhandledException(UI线程)和UnhandledException(非UI线程)。当我在dispatcher.Invoke中抛出异常时,dispatcherhandler捕获并处理该异常。在记录异常后,我将e.Handled设置为true。现在奇怪的行为是,如果我将异常抛出dispatcher.Invoke之外,作为一个常规语句,控制被发送到dispatcher异常处理程序,但在处理该方法后,应用程序基本上失去了控制,但我可以通过查看vs中的停止按钮来判断它是否仍在运行

还有一件事,如果我将e.handled设置为false,控件将被发送到非ui线程异常处理程序

因此,让我困惑的是,为什么在调度程序处理程序中处理exceptiono之后应用程序会锁定

这是我的密码

    private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
       // log exception here
        e.Handled = true; 
    } // control is lost after executing this block

    private void App_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        try
        {
            Exception ex = e.ExceptionObject as Exception;                
            // log exception here
        }
        finally
        {
            Environment.Exit(-1);
        }

    }

未处理的异常意味着您的应用程序实际上已死亡。如果您得到了该事件,那么就太晚了,无法从该场景中恢复。通常,您只会使用此事件记录错误以进行调试,并且可能会尝试清理一些非托管资源


下面详细解释了WPF中的异常处理。

未处理的异常意味着您的应用程序实际上已死亡。如果您得到了该事件,那么就太晚了,无法从该场景中恢复。通常,您只会使用此事件记录错误以进行调试,并且可能会尝试清理一些非托管资源


以下详细解释了WPF中的异常处理。

如果在OnStartup事件之后引发异常,则应用程序似乎能够恢复操作;如果在这两个事件之间引发异常,则会捕获并处理异常,但从未显示主窗口,但调试器显示应用程序正在运行


我找到的最接近的解决方案是从主窗口的构造函数中删除复杂的逻辑,以允许onstartup事件执行,并在我的主窗口加载事件中执行大量加载

如果在OnStartup事件之后引发异常,则应用程序似乎能够恢复操作;如果在这两个事件之间引发异常,则会捕获并处理异常,但从未显示主窗口,但调试器显示应用程序正在运行


我找到的最接近的解决方案是从主窗口的构造函数中删除复杂的逻辑,以允许onstartup事件执行,并在我的主窗口加载事件中执行大量加载

但为什么应用程序在执行e.handled=true后会进入植物人状态?在我的窗口构造函数中,我抛出异常,抛出新异常(“某些异常”)。控件被发送到dispatcherUnhandledException处理程序,但应用程序仍在运行。我不建议从窗口构造函数引发异常。相反,将您的逻辑放在初始化或加载的事件中,然后作为一个窗口自杀。但是,为什么应用程序在执行e.handled=true后会进入植物人状态?在我的窗口构造函数中,我抛出异常,抛出新异常(“某些异常”)。控件被发送到dispatcherUnhandledException处理程序,但应用程序仍在运行。我不建议从窗口构造函数引发异常。相反,将您的逻辑放在初始化或加载的事件中,然后作为窗口自杀。