[英]How to Terminate Threads that started within foreach loop in C#
我在Windows服務中為每個循環啟動了多個線程。我沒有提到這些線程的任何名稱。如何終止這些線程。 我使用以下代碼創建線程。
new Thread(() =>
{
foreach (MyClass detail in MyclassList)
{
DoWork(detail);
}
}).Start();
通過啟動這些線程,我為每個詳細信息創建一個計划任務。完成計划后,我可以處置該線程嗎?
強制終止線程絕不是一個好主意。 您真正應該做的是在循環中放入一些經過適當設計的“我應該繼續”檢查,以便您可以在外部設置為“ 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);
但是,有多種方法可以對線程安全的退出測試進行分類。 唯一有些棘手的事情是通過訪問要檢查的事物來保持某種上下文。
首先,我將使用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.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.