Application.Current.Shutdown()没有杀死我的应用程序

tsv*_*der 25 c# wpf visual-studio

我刚刚开始使用新的C#/ WPF应用程序并使用WPF Contrib项目中的NotifyIcon .我可以启动程序,将一个"Exit"MenuItem添加到NotifyIcon的ContextMenu,并将该项链接到一个只运行Application.Current.Shutdown()的方法.

这将关闭主窗口和NotifyIcon,但仍会继续运行 - 从VS运行,它不会离开调试模式.什么还在运行?或者我该如何检查?

编辑

我刚刚尝试添加一个调用Application.Current.Shutdown()的按钮,并且正确退出.只有从NotifyIcon调用时才会出现问题.为什么会这样?

为了澄清,我有以下XAML:

<Window x:Class="VirtualBoxManager.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:av="http://schemas.codeplex.com/wpfcontrib/xaml/presentation"
    Title="VirtualBox Manager" Height="350" Width="525"
    ShowInTaskbar="False" WindowStyle="None">
<Grid>
    <av:NotifyIcon Icon="/icon/path"
                   Text="Virtual Machine Manager"
                   Name="notifyIcon">
        <FrameworkElement.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Exit" Click="MenuItemExit_Click" />
            </ContextMenu>
        </FrameworkElement.ContextMenu>
    </av:NotifyIcon>
    <Button Content="Button" Click="button1_Click" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

button1_Click和MenuItemExit_Click都是相同的,但前者成功退出应用程序,而后者则没有.

进一步的实验:即使我将Application.Current.Shutdown()移动到另一个方法并调用它,添加一个间接层,仍然按钮工作而图标不工作.

解决方案找到

刚刚找到这个帖子,谁的解决方案在这里工作.我不完全理解发生了什么,所以如果有人关心解释我会很感激.

小智 19

你可以试试Environment.Exit(0);它用给定的退出代码杀死进程.退出代码0表示应用程序已成功终止.它可能更"粗鲁"或"未完成",但也许这就是你要找的东西.

  • 这确实会强制关闭应用程序,但在关闭之前整个过程会冻结一秒钟。 (2认同)

Ben*_*gie 8

我发现如果创建未设置为"background"的线程,主窗口/ etc将关闭,但线程将继续运行.

换句话说,只有后台线程在主线程结束时自行关闭.常规线程,即Thread.IsBackground = false,将使进程保持运行.

尝试使用thread.IsBackground = true;

PS我假设你在某处使用过线程.


Fil*_*kun 8

我认为作者的答案是这里最好的答案,但还没有真正被召唤出来。Application.Shutdown()似乎需要在调度程序线程上执行才能工作。如果遇到问题,请尝试以下操作:

Application.Current.Dispatcher.Invoke(Application.Current.Shutdown);
Run Code Online (Sandbox Code Playgroud)


小智 5

我在我的应用程序中遇到了同样的问题。在我的启动模块 (Startup.cs) 中,我发现这对我有用:

Process.GetCurrentProcess().Kill();
Run Code Online (Sandbox Code Playgroud)

代码如下:

class StartUp
{
    [STAThread]
    public static void Main()
    {

    try
    {
        Process[] processes = new Process[6];
        App app = new App();
        app.InitializeComponent();
        app.Run();
        Process.GetCurrentProcess().Kill(); //Must add this line after app.Run!!!
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }
    }
Run Code Online (Sandbox Code Playgroud)

这直接进入导致挂起的进程。无需遍历多个进程。

  • 真的吗?Yopu 认为问题的解决方案只是让应用程序杀死它自己的进程......坏主意! (3认同)