2011-09-17 36 views
0

我是非常新的多線程和c#,我必須解決這個問題: 我有事件處理程序,它很頻繁地觸發(它必須這樣做,因爲事件處理程序調用是從DLL調用) 當處理程序方法被調用時,我需要創建並運行一個線程,它會做一些東西,它的處理可以從幾毫秒到幾秒不等,當它完成它的工作時,它會自己殺死它。完成後,evenhandler可以創建另一個線程。同時創建的線程正在運行,沒有其他線程可以創建並從事件處理程序運行。從事件處理程序運行自殺線程

非常感謝您的幫助。

+0

當先前創建的工作線程仍在運行時引發事件時,您想要執行什麼操作?阻塞引發事件的線程,直到工作線程完成?排隊新線程的產卵並返回?只是決定不產生新的線程並返回? – Ani

+0

如何檢查事件處理程序線程是否已在運行,並使線程安全?這似乎很容易,只是爲了跳過創建新的線程。 – BreteP

回答

4

所有這些聽起來很複雜,我沒有什麼你實際上是試圖做一個良好的意識,但它聽起來像這樣將與額外的線程和共享隊列可以更好地處理工作項目。您的事件處理程序只會將另一個工作項添加到隊列中,並且該線程將從隊列中選擇項並逐個處理它們。

.NET 4通過BlockingCollection<T>類型使這變得容易。在.NET 4之前,它仍然是可行的,但是您需要找到第三方線程安全的生產者/消費者隊列或自己編寫一個隊列。

+0

我已經關閉了dll,它正在讀取http流,並且不時發現它觸發事件處理程序的一些數據。我需要創建線程並將這些數據傳遞給線程進行處理。同時dll線程仍在運行,並從http讀取數據並觸發事件處理程序,但我不想創建用於數據處理的新線程,直到第一個線程完成。 – BreteP

0

自殺的線程存在問題。當線程自行殺死時,必須與主線程同步。

這聽起來好像你會做一個單一的專用線程來完成這項工作。使用阻塞隊列並實施生產者/消費者模式。當它沒有任何事情時,不要殺死線程,而是讓它處於空閒狀態,直到更多工作到達。

+0

那也應該工作,就像我寫的,我對線程很陌生。我會很感激一些簡短的例子,特別是如何檢測線程是否正在處理(跳過將數據發送到事件處理程序中的線程)。 – BreteP