如何终止在C#中的foreach循环内启动的线程

时间:2012-05-17 11:05:02

标签: c# windows multithreading service

我在我的windows服务中为每个循环启动了多个线程。我没有提到这些线程的任何名称。我怎么能终止这些线程。 我使用以下代码创建线程。

 new Thread(() =>
            {
                foreach (MyClass detail in MyclassList)
                {
                    DoWork(detail);
                }

            }).Start();

通过启动这些线程,我为每个细节创建一个计划任务。我可以在计划完成后如何配置此线程以及如何处理?

2 个答案:

答案 0 :(得分:8)

强行终止线程从不一个好主意。你真正应该做的是在循环内部设置一些适当设计的“我应该继续”检查,你可以在外部设置为“no”。 如何做到这一点取决于上下文...例如:

        int shouldExit = 0;
        new Thread(() =>
        {
            foreach (MyClass detail in MyclassList)
            {
                if(Thread.VolatileRead(ref shouldExit) != 0) break;
                DoWork(detail);
            }
        }).Start();
        ...
        // to terminate loop:
        Thread.VolatileWrite(ref shouldExit, 1);

然而,有许多方法可以解决线程安全的退出测试;唯一有点棘手的事情是保持某种上下文可以访问被检查的东西。

答案 1 :(得分:0)

首先,我会使用Task类而不是直接创建新线程。然后,我会使用内置的TPL取消机制。这就是它的样子。

var cts = new CancellationTokenSource();
var token = cts.Token;

var task = Task.Factory.StartNew(
  () =>
  {
    foreach (MyClass detail in MyclassList)
    {
      ct.ThrowIfCancellationRequested();
      DoWork(detail);
    }
  }, cts.Token); 

// Do other stuff here.

cts.Cancel(); // Request cancellation.