C# 关闭GUI时终止线程

C# 关闭GUI时终止线程,c#,multithreading,C#,Multithreading,我需要在两台不同的服务器上执行一项时间密集型任务 服务器的数量可能会有所不同 我需要在几乎相同的时间在每台机器上执行相同的任务,否则这一过程所需的时间将增加四倍 到目前为止,我已经能够想到: public partial class Form_main : Form { list<string> vms = new list<string>; ///Fill in vms... private void startTest() {

我需要在两台不同的服务器上执行一项时间密集型任务

服务器的数量可能会有所不同

我需要在几乎相同的时间在每台机器上执行相同的任务,否则这一过程所需的时间将增加四倍

到目前为止,我已经能够想到:

public partial class Form_main : Form
{
    list<string> vms = new list<string>;
    ///Fill in vms...
    private void startTest()
    {
        ///prevents GUI from hanging
        ThreadPool.QueueUserWorkItem(new WaitCallback(runTests));
    }
    pirvate void runTests()
    {
        ///Some setup stuff (~1 min)
        foreach(string vm in vms)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(testProcedure), new object[] {vm});
        }
    }
}
public分部类表单\u main:表单
{
列表VM=新列表;
///填写虚拟机。。。
私有void startTest()
{
///防止GUI挂起
QueueUserWorkItem(新的WaitCallback(runTests));
}
pirvate void运行测试()
{
///一些安装材料(约1分钟)
foreach(虚拟机中的字符串虚拟机)
{
QueueUserWorkItem(新WaitCallback(testProcedure),新对象[]{vm});
}
}
}
这适用于同时运行所有内容,但问题是,如果GUI被终止,线程不会随之终止。我想象它正在杀死runTests线程,但没有杀死testProcedures线程


如何使testProcedures线程在关闭GUI时被终止?

您可以在主窗体的处理程序中调用方法。

当您关闭GUI时,是
应用程序。运行(…)
运行到完成并退出
静态void main(string[]args)
方法?在所有放弃的线程完成之前,后台线程不会自动终止。
Main
没有退出,或者您正在其他地方创建未显示的前台线程。与之相反,您应该合作退出线程(即设计一种机制,以便您可以“通知”线程它应该在下一个适当的时刻正常停止)。并且考虑使用(和它们的取消令牌)代替“裸”线程。这会模糊问题。如果你有其他的前台线程在运行,那么你应该确定你是否真的想要前台线程;也许它们应该是后台线程。如果
Application.Run
没有结束,那么其他东西会使UI保持活动状态,您应该确定那里发生了什么并解决它。这是隐藏一个潜在的问题,而不是解决它。你是对的,你是错的。是的,可能有问题。但也许不是。例如,在.NET1.0中,所有线程不会在主线程退出时自动终止。通常,调查可以可靠地用一行程序解决的无关问题的成本太高。在所描述的情况下,我们知道我们真的想杀死他们,而这就是我们正在做的?有更好的方法吗?也许。即使从长远来看,它会花费更少的时间吗?很难。如果您专门调查了是什么使应用程序保持活动状态,并确认没有其他方法可以更优雅地结束应用程序,那么当然,这可能是偶尔有效的最后手段。这个问题清楚地表明情况并非如此,因为他不知道是什么导致应用程序保持活动状态。如果您不知道潜在的问题是什么,那么这是一个完全不合适的解决方案,因为在杀死这样的应用程序时可能会遇到重大问题。建议OP甚至不尝试诊断问题是完全不可接受的。@Servy我完全同意尝试诊断问题是个好主意。不可接受的是GUI线程被阻塞,无法访问其ExitProcess()或其他调用,因为它正在不必要地等待其他线程。设置“Thread.IsBackground=true”应适用于线程子体。如果其他线程没有重写的理由执行任何终止操作,那么编写代码来显式终止它们是浪费时间和精力的——让操作系统来做吧——它非常擅长,比任何用户代码都简单和可靠得多。