簡體   English   中英

C#-ThreadPool.QueueUserWorkItem()要求

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

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