首頁 後端開發 C++ 如何在不使用 Thread.Abort() 的情況下安全地中斷 .NET 中長時間執行的任務?

如何在不使用 Thread.Abort() 的情況下安全地中斷 .NET 中長時間執行的任務?

Jan 20, 2025 am 01:07 AM

How to Safely Interrupt Long-Running Tasks in .NET Without Using Thread.Abort()?

安全停止 .NET 任務:Thread.Abort()

的替代方案

與可以使用 Thread.Abort() 強制停止的執行緒不同,.NET 4.0 及更高版本中的任務缺乏立即終止的直接等效方法。雖然取消代幣提供了一種優雅的退出策略,但某些情況需要立即中斷任務。

要求立即終止任務的場景

考慮一個 Windows 窗體應用程式在平行循環中執行阻塞同步 Web 服務呼叫:

CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
po.MaxDegreeOfParallelism = System.Environment.ProcessorCount;

Parallel.ForEach(iListOfItems, po, (item, loopState) =>
{
    Thread.Sleep(120000); // Simulates a web service call
});
登入後複製

如果使用者在進程中關閉應用程序,並行循環的執行緒將繼續運行,可能會導致延遲和應用程式凍結。

超越取消令牌

取消令牌是優雅終止的理想選擇,但它們對於阻止呼叫的效果較差。 更強大的解決方案涉及布林標誌 stopExecuting,在任務循環中檢查以發出立即停止的信號:

bool stopExecuting;

Parallel.ForEach(iListOfItems, po, (item, loopState) =>
{
    if (stopExecuting)
    {
        loopState.Stop();
        return;
    }
    // Task execution code
});
登入後複製

stopExecuting 設定為 true 當使用者關閉表單時會停止所有正在執行的任務。 然而,這並不能消除已經運行的阻塞呼叫所帶來的延遲。

Thread.Abort() – 最後的手段

Thread.Abort() 可以在平行循環產生的執行緒上使用,作為最後的手段,但由於潛在的系統不穩定,強烈建議不要這樣做。

使用執行緒安全共享標誌並避免立即終止取消令牌,為需要快速任務中斷的場景提供了更安全、更易於管理的方法。

以上是如何在不使用 Thread.Abort() 的情況下安全地中斷 .NET 中長時間執行的任務?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Gulc:從頭開始建造的C庫 Gulc:從頭開始建造的C庫 Mar 03, 2025 pm 05:46 PM

Gulc:從頭開始建造的C庫

c語言函數返回值的類型有哪些?返回值是由什麼決定的? c語言函數返回值的類型有哪些?返回值是由什麼決定的? Mar 03, 2025 pm 05:52 PM

c語言函數返回值的類型有哪些?返回值是由什麼決定的?

c語言函數格式字母大小寫轉換步驟 c語言函數格式字母大小寫轉換步驟 Mar 03, 2025 pm 05:53 PM

c語言函數格式字母大小寫轉換步驟

c語言函數的定義和調用規則是什麼 c語言函數的定義和調用規則是什麼 Mar 03, 2025 pm 05:53 PM

c語言函數的定義和調用規則是什麼

distinct用法和短語分享 distinct用法和短語分享 Mar 03, 2025 pm 05:51 PM

distinct用法和短語分享

c語言函數返回值在內存保存在哪裡? c語言函數返回值在內存保存在哪裡? Mar 03, 2025 pm 05:51 PM

c語言函數返回值在內存保存在哪裡?

C標準模板庫(STL)如何工作? C標準模板庫(STL)如何工作? Mar 12, 2025 pm 04:50 PM

C標準模板庫(STL)如何工作?

如何有效地使用STL(排序,查找,轉換等)的算法? 如何有效地使用STL(排序,查找,轉換等)的算法? Mar 12, 2025 pm 04:52 PM

如何有效地使用STL(排序,查找,轉換等)的算法?

See all articles