2

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

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

            }).Start();

通过启动这些线程,我为每个细节创建了一个调度任务。我可以在调度完成后处理这个线程吗?如何?

4

2 回答 2

9

强行终止线程绝不是一个好主意。您真正应该做的是在循环中放置一些经过适当设计的“我应该继续”检查,您可以在外部将其设置为“否”。如何做到这一点更多地取决于上下文......例如:

        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);

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

于 2012-05-17T11:09:14.063 回答
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.
于 2012-05-17T15:27:38.360 回答