簡體   English   中英

具有連續(無盡)任務的線程管理控制台程序

[英]Thread management console program with continuous (endless) tasks

我是線程技術的新手,請耐心等待。

我在數據庫中有成千上萬的行。 每行代表需要通過Internet完成的一項工作。 我讀了一個數據行,做了一些與網絡有關的工作(甚至可能需要幾秒鍾到幾分鍾的時間),然后抓取下一個數據行(我的C#應用​​程序使用控制台,而不是GUI)。 如您所料,我想同時做這些工作。

我研究了這個主題,並以為會使用BackgroundThreads,但是如果我理解正確, 人們建議在控制台應用程序中使用它們是沒有意義的。

我假設我不應該使用Tasks,因為我的每個“任務”都將由一個線程表示。

所以我想我將ThreadPool與常規Threads一起使用。

為了使事情變得簡單,我只想保持恆定數量的線程(在一個線程結束時生成新線程),直到我用盡所有要做的事情(然后我等待數據(通常是很多)到達數據庫並生成線程) )。 我需要知道線程何時結束,因為我必須產生一個新線程並更新包含正在使用的數據的數據庫行。 為了使線程和數據庫保持同步,我可能不得不在檢索數據庫行時用某種線程ID對其進行標記,然后在線程結束時將該行標記為(成功/失敗)。 此解決方案 (嘗試在線程委托中進行捕獲)是否足以確保線程已結束(並且是否成功或引發了異常)?

我不確定如何“等待”第一個線程結束-不是所有線程,也不是特定線程。

我還認為我不想提前讀取太多數據(並可能等待線程釋放),因為可能會有其他程序使用相同的數據庫執行相同的操作。

任何想法表示贊賞!

只需使用Parallel.ForEach即可:

Parallel.ForEach(rows, row => ProcessRow(row));

如果由於自動分區器恰好使用了太多線程池線程而需要指定最大並行度,則可以這樣指定:

Parallel.ForEach(rows, new ParallelOptions() { MaxDegreeOfParallelism = 5 }
    , row => ProcessRow(row));

暫無
暫無

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

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