2008-09-20 55 views

回答

7

如果這些數據片段是獨立的,那麼將這些數據片段視爲要由線程池處理的工作項目。使用線程池和QueueUserWorkItem將數據發佈到線程。您應該使用對稱線程池獲得更好的可伸縮性,並限制生產者和消費者之間必須發生的同步數量。

例如(從MSDN):

TaskInfo ti = new TaskInfo("This report displays the number {0}.", 42); 

    // Queue the task and data. 
    if (ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ti)) {  
     Console.WriteLine("Main thread does some work, then sleeps."); 

     // If you comment out the Sleep, the main thread exits before 
     // the ThreadPool task has a chance to run. ThreadPool uses 
     // background threads, which do not keep the application 
     // running. (This is a simple example of a race condition.) 
     Thread.Sleep(1000); 

     Console.WriteLine("Main thread exits."); 
    } 
    else { 
     Console.WriteLine("Unable to queue ThreadPool request."); 
    } 


// The thread procedure performs the independent task, in this case 
// formatting and printing a very simple report. 
// 
static void ThreadProc(Object stateInfo) { 
    TaskInfo ti = (TaskInfo) stateInfo; 
    Console.WriteLine(ti.Boilerplate, ti.Value); 
} 
5

我使用Monitor.Wait /脈衝隊列的工作項目。

+0

是的,監控是生產者/消費者場景的方式。 – 2008-09-21 23:17:48

0

是否 「存儲在DB」 線程總是需要運行?看來也許最好的選擇(如果可能的話)是讓輪詢線程啓動另一個線程來完成保存。根據正在創建的線程數量,可能會有第一個輪詢線程使用ThreadPool.QueueUserWorkItem()可能是更有效的路由。

爲了提高效率,在保存到數據庫時,我會在數據庫上使用異步I/O而不是同步方法。

無論何時,您都可以擺脫直接在兩個線程之間進行通信的需求。不得不把一些同步原語放在一起,你的代碼不會很容易調試,並可能引入一些非常微妙的競爭條件,導致「百萬次執行」類型的錯誤(這些錯誤遠沒有找到/修復很有趣)。

如果第二個線程總是需要執行,讓我們知道爲什麼有更多的信息,我們可以回來一個更深入的答案。

祝你好運!

0

我個人將有線程1提高線程2可以響應的事件。線程可以通過啓動兩個線程的控制進程連接到適當的事件。

+0

我不知道「線程」如何捕捉事件。我可以考慮如何讓一個類捕獲一個在特定線程中引發的事件,但是event_handler的執行仍然與它引發的線程在同一個線程中,不是? – skb 2008-09-20 19:37:03

相關問題