Application.Current.Shutdown()无法正常关闭应用程序

7

关于这个问题,标题已经说得很清楚了。这是一个涉及到WCF的WPF应用程序中的IPC问题。我调用了Application.Current.Shutdown()方法,但是应用程序却继续运行。我原本以为Shutdown应该是不可阻止的。

可能是因为它是从后台线程调用的?我需要进行一些调度器操作吗?

3个回答

14

在主线程以外的任何线程调用Application.Current.Shutdown时会出现异常,因此我认为您已经正确使用了“dispatcher fiddling”。

无论如何,这将编译并退出应用程序,因此如果调度程序位不像您所拥有的那样,您可以将其扔进去:

ThreadStart ts = delegate()
    {
        Dispatcher.BeginInvoke((Action)delegate()
        {
            Application.Current.Shutdown();
        });
     };
 Thread t = new Thread(ts);
 t.Start();

我一直在尝试弄清楚这个问题,这种方法似乎有效。请问将调度程序调用包装在线程中为什么会使其正常工作? - StrikeForceZero
有些类使用的线程不在后台运行。通常关闭只会自动杀死后台线程。 因此,在退出之前,您应该尝试确保处理使用线程的类的任何变量。 - Zunair
请注意,这似乎是指Application.Current.Dispatcher,而不是System.Windows.Threading.Dispatcher。 - Josh

11

根据我的经验,所有的线程要么明确地被终止,要么被标记为后台线程,以便应用程序能够关闭。

以下是在后台启动读取线程的示例:

_readThread = new Thread(new ThreadStart(ReadThread));
_readThread.Name = "Receiver";
_readThread.Priority = ThreadPriority.Highest;
_readThread.IsBackground = true;
_readThread.Start();

IsBackground属性是关键。如果没有设置它,线程在调用Shutdown时不会终止。


应用程序可以通过其他方式正常关闭。 - Thomas
1
非常感谢您的评论,它让我省去了烦恼并帮助我找到了为什么我的应用程序没有完全退出的原因。 - Adam Prax

2

我只遇到过在Visual Studio中运行时Application.Current.Shutdown无法正常工作的情况。至少在我使用的2010版本中,Application.Current.Shutdown没有任何作用。如果我单步执行它,它会执行此行,然后继续执行。如果我从Windows资源管理器中作为.exe文件运行程序,则Application.Current.Shutdown可以正常工作。

这可能有一个解释,因为在调试期间其他线程是活动的,但我无法解释。


是的,我也有同感,但这真的会影响我的调试工作。 - ProfK
1
应用程序在没有附加调试器的情况下实际上会崩溃。 - Emond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接