【问题标题】:How to stop multithread start by for loop condition如何通过for循环条件停止多线程启动
【发布时间】:2012-05-22 05:46:30
【问题描述】:

这段代码将向您展示我是如何启动多个线程的:

for (int i = 0; i < 8; i++)
{
    doImages    = new DoImages(this, TCPPORT + i);
    var thread  = new Thread(doImages.ThreadProc);
    thread.Name = "Imaging";
    var param = (i + 1).ToString();                      
    thread.Start(param);
}

现在我试图在关闭我的应用程序之前停止线程,但我不知道该怎么做?

【问题讨论】:

  • 您需要保留一个对象来跟踪类中的线程。为你的类实现一个 Dispose 方法来杀死跟踪的线程,你应该没问题。
  • '现在我试图在关闭应用程序之前停止线程,但我不知道该怎么做?' - 你试过不阻止他们吗?如果你不停止它们,不调用 Thread.Join(),不发出停止信号,不做任何事情,会发生什么真正糟糕的事情?

标签: c# .net multithreading for-loop


【解决方案1】:

一个简单的选择是存储对您生成的所有线程的引用,然后在完成后加入所有线程:

Thread[] threads = new Thread[8];
for (int i = 0; i < 8; i++)
{
    doImages    = new DoImages(this, TCPPORT + i);
    var thread  = new Thread(doImages.ThreadProc);
    threads[i] = thread;
    thread.Name = "Imaging";
    var param = (i + 1).ToString();                    
    thread.Start(param);
}
for (int i = 0; i < 8; i++)
{
    threads[i].Join();
}

这将在应用程序终止之前等待所有线程完成。

【讨论】:

  • 感谢您的回复。并非您的所有代码都成功,但我使用您的线程数组理想地通过循环遍历每个线程项来停止我的线程。我也创建了 DoImages 类的数组来停止它。
【解决方案2】:

最干净和最可靠的方法是让它们成为后台线程:

for (int i = 0; i < 8; i++)
{
    doImages    = new DoImages(this, TCPPORT + i);
    var thread  = new Thread(doImages.ThreadProc);
    thread.Name = "Imaging";
    var param = (i + 1).ToString();  
    thread.IsBackground = true;          // **
    thread.Start(param);
}

当进程(主线程)退出时,后台线程会自动终止。

【讨论】:

    【解决方案3】:

    如果您保留对线程对象的引用并且只想退出您的应用,则可以使用 thread.Abort();

    我的猜测是您希望完成执行然后关闭应用程序。为此,您需要使用Join() 或其他同步方法来同步您的线程。

    【讨论】:

    • 但是通常应该避免使用 Thread.Abort()。由于这是关于退出进程,因此可以使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多