2012-03-08 73 views
1

在我的應用程序中,我有一組插件 - 在應用程序中發生某些事件時執行一些小操作的類。插件的每個方法都必須在單獨的線程中調用,但每個插件只能同時運行一個方法。我們應該使用自己的線程還是線程池來處理小而頻繁的任務?

我可以實現這個使用兩種方法:

  1. 爲每個插件將處理來自插件的隊列中的事件,直到隊列爲空創建一個線程。然後睡覺,直到新事件排隊,處理它等等。

  2. 當事件來到插件的隊列時,它在線程池線程中進行處理。當隊列變空時,將其釋放回線程池。

問題是:這兩種方式的優缺點是什麼?

一些澄清:

  • 插件不加載CPU太多,大部分時間他們只是等待下一個事件。
  • 我不在乎創建線程所需的時間,插件是長期生活的。
  • 通常我有〜10-20個這樣的插件,每個應用程序。
+0

「儘管每個插件只能同時運行一種方法」 - 您是否認爲對於給定的插件,您不能同時調用兩種方法?但是,如果你有單獨的插件,你可以同時在這些不同的插件上執行方法? – RandomEngy 2012-03-08 22:41:14

+0

是的,正是...... – 2012-03-09 21:30:42

回答

2

一個插件中的每一個方法必須在單獨的線程中調用,雖然只有一個各插件的方法可以同時運行。

如果這是您的要求,我會考慮圍繞BlockingCollection<T>構建插件。當你添加一個插件時,開始一個長時間運行的任務,只需foreachBlockingCollection.GetConsumingEnumerable()

這將允許您將項目添加到他們的「隊列」,並且該插件將按順序自動處理這些項目,而不需要您自己的「睡眠」處理。每個插件只能使用blockingCollection.GetConsumingEnumerable來處理其隊列中的項目。

1

我已經看到它的兩種方式。每個插件有一個線程會變得很醜陋 - 你開始依賴「只有一個線程觸及我的插件」的想法,然後有人在一個插件的線程去觸及其他插件的時候出錯了(儘管複雜的事件處理或類似的東西)。那麼你最終會遇到非常難以跟蹤的比賽條件。

@ Reed-Copsey建議的方法要簡潔得多,但如果您必須使用您提到的兩種方法之一,那麼使用線程池並適當地鎖定會稍後爲您節省一些心痛。如果您有多個團隊成員在項目的多個方面工作,這尤其適用。

1

我會去#2。原因是你沒有圍繞一堆大部分時間處於空閒狀態的線程。這樣做確實沒有缺點,因爲您也可以在不同的插件和每個給定插件的順序執行之間獲得並行性。

相關問題