簡體   English   中英

如何終止在C#中的foreach循環內啟動的線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM