我通常有一个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();
编辑 应用名称显示在任务管理器的“应用”类别下。如果我在启动线程之前关闭了应用程序,则从任务管理器中删除了应用程序名称。如果我在启动线程后关闭了应用程序,则该应用程序名称将从应用程序类别中删除,并显示在后台进程类别中。
答案 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();
现在,它的工作正常。