[英]C# - ThreadPool.QueueUserWorkItem() Requirements
我有一個Windows服務,需要同時執行很多工作。 我研究了線程並找到ThreadPool類。 我目前陷入困境,似乎沒有任何效果,就像我排隊的東西永遠不會運行或調用。 在服務的OnStart()事件中,我創建一個如下線程:
Thread mainThread = new Thread(ReceiveMessages);
mainThread.Start();
在方法ReceiveMessages()中,我有一個例程,該例程檢查消息隊列,然后遍歷消息。 對於每次迭代,我調用以下代碼對每個消息進行一些處理:
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object state)
{
Interpreter.InsertMessage(encoding.GetBytes(MessageBody));
}), null);
我認為語法是正確的,可以毫無問題地進行編譯,但是我不禁感到自己缺少一些東西。 當我運行該服務時,什么都沒有發生。 但是,如果我將上面的代碼片段替換為:
insertThread = new Thread(delegate() { Interpreter.InsertMessage(encoding.GetBytes(MessageBody)); });
insertThread .Start();
它可以100%工作。 它不是很有效,但是會導致服務崩潰(偶爾會這樣做,這就是我嘗試使用TheadPool的原因)。 誰能闡明這個問題?
似乎您正在等待回調中通過MessageBody
創建一個閉包 。 如果在線程池執行工作項時調用方的 MessageBody
屬性為null,則InsertMessage
將對其進行操作。
您需要定義一個Interpreter.InsertMessage
的重載,該重載接受一個對象並將其用作WaitCallback
:
public void InsertMessage(object messageBody) {
this.InsertMessage((byte[])messageBody);
}
然后將消息正文字節作為第二個參數傳遞:
ThreadPool.QueueUserWorkItem(new WaitCallback(Interpreter.InsertMessage),
encoding.GetBytes(MessageBody));
默認情況下,創建新線程時,該線程是“ 前台線程” 。 但是,ThreadPool線程的IsBackground設置為true。
這意味着線程池線程將無法使您的應用程序保持活動狀態。 這可能就是為什么它永遠不會“運行”的原因-它只是立即關閉。
它不是很有效,但是會導致服務崩潰(偶爾會這樣做,這就是我嘗試使用TheadPool的原因)。 誰能闡明這個問題?
自構造線程應同樣高效(一旦線程啟動並運行)。 ThreadPool線程不會以任何方式幫助“崩潰”-您仍然需要適當地調試服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.