簡體   English   中英

如何在C#.NET中的循環中創建不確定的后台線程

[英]How to create indefinite Background Threads in a loop in C#.NET

我有一個循環,需要創建一個不確定的和不確定數量的背景線程。 然后,這些線程將簡單地運行到完成,但其中一些線程可能需要取消。

我最初計划通過聲明一個backgroundWorker並將其添加到列表中,然后更新BackgroundWorker來重新開始該過程。 但是,因為List.Add方法是通過引用傳入的對象來運行的,所以我想當我新建原始BackgroundWorker時,List引用的線程將丟失(或更糟)。

我的第二個想法只是將我的新值分配給數組中的一個元素(array [i] = new BackgroundWorker()),但這不會使自己不確定的線程數量。

有沒有人建議管理這些單獨線程的好方法? 提前致謝。

兩句話-一分,一分。

首先,TPL似乎可以滿足您設定的目標。 使用Task.Factory.StartNew() ,您將能夠產生任意數量的將在后台線程上運行的操作。 此外,使用帶有CancellationToken的重載,您可以按期望的程度取消操作。 請注意,任務不等同於線程-默認情況下,任務在ThreadPool線程中運行(順便說一下,后台工作程序也是如此)。 您的任務很有可能最終會進入隊列,等待池化線程可用。

第二,更大的評論。

您聲稱您將擁有數量不確定且不確定的工作項。 您將為每個項目生成一個線程使我有點前衛-線程並不便宜,並且如果您有大量的工作項目,則可以通過天真地啟動新線程來餓死您的進程。

您能詳細說明這些線程需要做什么嗎? 我不知道什么構成您的項目的工作項,但是具有固定數量線程的生產者/消費者設置完全有可能滿足您的並行化需求。 .NET 4.0使System.Collections.Concurrent類變得容易。

編輯以回應評論

TCP連接的情況幾乎是我在上面寫第二條評論時所想的。 在這種情況下,您正在考慮有限的OS資源(即開放套接字)的潛在無限消耗。 希望您能研究非阻塞I / O。 這個MSDN頁面記錄了從套接字異步讀取的內容,並且這一頁討論了.NET中更大的異步編程模型。

對於可伸縮的TCP服務,關於SO的討論已經很好:請細心閱讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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