我有兩個線程,需要輪詢一堆單獨的靜態資源來尋找更新。另一個需要獲取數據並將其存儲在數據庫中。線程1如何告訴線程2有什麼需要處理?在.NET中的併發線程之間傳遞數據的最佳方式是什麼?
回答
如果這些數據片段是獨立的,那麼將這些數據片段視爲要由線程池處理的工作項目。使用線程池和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);
}
我使用Monitor.Wait /脈衝隊列的工作項目。
是否 「存儲在DB」 線程總是需要運行?看來也許最好的選擇(如果可能的話)是讓輪詢線程啓動另一個線程來完成保存。根據正在創建的線程數量,可能會有第一個輪詢線程使用ThreadPool.QueueUserWorkItem()可能是更有效的路由。
爲了提高效率,在保存到數據庫時,我會在數據庫上使用異步I/O而不是同步方法。
無論何時,您都可以擺脫直接在兩個線程之間進行通信的需求。不得不把一些同步原語放在一起,你的代碼不會很容易調試,並可能引入一些非常微妙的競爭條件,導致「百萬次執行」類型的錯誤(這些錯誤遠沒有找到/修復很有趣)。
如果第二個線程總是需要執行,讓我們知道爲什麼有更多的信息,我們可以回來一個更深入的答案。
祝你好運!
我個人將有線程1提高線程2可以響應的事件。線程可以通過啓動兩個線程的控制進程連接到適當的事件。
我不知道「線程」如何捕捉事件。我可以考慮如何讓一個類捕獲一個在特定線程中引發的事件,但是event_handler的執行仍然與它引發的線程在同一個線程中,不是? – skb 2008-09-20 19:37:03
- 1. 在android應用程序之間傳遞數據的最佳方式是什麼?
- 2. 在vue.js中的組件之間傳遞數據的最佳方式是什麼?
- 3. 在類之間管理數據的最佳方式是什麼?
- 4. 在Winforms C#中的GUI之間傳遞變量的最佳方式是什麼?
- 5. 在.NET應用程序中傳遞XML的最佳方式是什麼?
- 6. durandal:在ViewModels之間傳遞數據的最佳方式
- 7. 在Segmentation之間傳遞ViewController數據的最佳方式
- 8. 什麼是在java中傳遞數組的最佳方式
- 9. 在onPause和onResume之間傳輸數據的最佳方式是什麼?
- 10. 鏈接視圖並在它們之間傳遞數據的最佳方式是什麼?
- 11. 在不同線程中的類之間傳遞對象的最佳方式?
- 12. iphone開發中的對象之間傳遞數據的最佳方式?
- 13. 在java程序運行之間存儲數據的最佳方式是什麼?
- 14. python線程 - 將參數傳遞給線程的最佳方式
- 15. 什麼是故事板視圖之間傳遞對象的最佳方式?
- 16. 在PyQt中,在主窗口和線程之間共享數據的最佳方式是什麼
- 17. 什麼是在C#中的線程之間傳遞數據的快速,高效的內存方式?
- 18. Android中的Thread和AsyncTask之間的最佳方式是什麼?
- 19. 在應用程序中,在活動之間傳遞自定義對象的最佳方式是什麼?
- 20. 在MainFrame(或主對話框)和Modal對話框之間傳遞數據的最佳方式是什麼?
- 21. 通過無線在iOS和MacOS之間傳輸數據的最佳方式是什麼?
- 22. 在C#中,在2個線程之間傳遞數據的推薦方式是什麼?
- 23. 在.Net的各個線程之間同步對象集合的最佳方式是什麼?
- 24. 在表單之間傳遞連接對象的最佳方法是什麼?
- 25. 什麼是在.NET中「平方」圖像的最佳方式?
- 26. 將大數據傳遞到C#函數的最佳方式是什麼?
- 27. 從數據輸入到驗證的測試之間傳遞變量的最佳方式是什麼?
- 28. Flex中組件之間共享數據的最佳方式是什麼?
- 29. 在servlet和jsp之間傳輸數據的最佳方式?
- 30. 在存儲過程中傳遞表的最佳方式是什麼
是的,監控是生產者/消費者場景的方式。 – 2008-09-21 23:17:48