我在我的windows服务中为每个循环启动了多个线程。我没有提到这些线程的任何名称。我怎么能终止这些线程。 我使用以下代码创建线程。
new Thread(() =>
{
foreach (MyClass detail in MyclassList)
{
DoWork(detail);
}
}).Start();
通过启动这些线程,我为每个细节创建一个计划任务。我可以在计划完成后如何配置此线程以及如何处理?
答案 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.