Application.Current.Shutdown()C#应用程序无法正确关闭

时间:2020-05-18 12:14:39

标签: c# asp.net .net windows

我通常有一个c#应用程序Application.Current.Shutdown()成功关闭了该应用程序。但是,当在应用程序内部创建新线程然后关闭时,应用程序无法正确关闭。内部任务管理器应用程序在后台任务关闭后显示。为什么会这样?如何在关闭时杀死与我的应用程序关联的所有线程?

public void ButtonClose(object sender, RoutedEventArgs e)
    {
        System.Windows.Application.Current.Shutdown();
    }

Thread Launch = new Thread(() => Job(id,name));Launch.Start();

编辑 应用名称显示在任务管理器的“应用”类别下。如果我在启动线程之前关闭了应用程序,则从任务管理器中删除了应用程序名称。如果我在启动线程后关闭了应用程序,则该应用程序名称将从应用程序类别中删除,并显示在后台进程类别中。

3 个答案:

答案 0 :(得分:0)

应用程序要等到其所有线程都完成后才能完成,当您关闭窗口时,您只关闭了处理接口的主线程,但是线程使它保持活动状态,我建议使用类似的方法。

private System.Threading.Thread thread;
private System.Threading.CancellationTokenSource token = new System.Threading.CancellationTokenSource();

//starting Thread
thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart((obj) =>
{
while (true && !token.IsCancellationRequested)
{
    //long running operation
    System.Threading.Thread.Sleep(100);
} }));
thread.Start();

//on main window
window.Closed += (obj, args) =>
{
    token.Cancel();
    Application.Current.Shutdown();
};

答案 1 :(得分:0)

如果您没有特定的理由偏爱线程,我建议您使用任务而不是线程。任务的管理方式不同,通常在线程池上执行,这就是为什么它们产生较少的开销的原因。此外,与任务相比,使用线程可能会犯更多的错误。

当您关闭应用程序时,任务将自动结束。您可以启动这样的任务:

Task.Run(()=>
{
    //This code is executed in another task (asynchronously)
});

答案 2 :(得分:0)

问题是System.Windows.Application.Current.Shutdown();没有终止我的线程。我发现Thread.Abort()方法可以中止线程,我将代码更改为

private Thread Launch;
public void ButtonClose(object sender, RoutedEventArgs e)
    {
        try
        {
            Launch.Abort();
            Logger.Info("Thread aborted");
        }
        catch (Exception ex)
        {
            Logger.Error("Exception inside close --> " + ex.Message);
        }
        System.Windows.Application.Current.Shutdown();
    }

Launch = new Thread(() => Job(id, name)); Launch.IsBackground = true; Launch.Start(); 现在,它的工作正常。