您可以考慮使用類似於您已有的生產者/消費者模型,而不是基於事件的體系結構。但不是在一段時間內醒來,而是使用BlockingCollection
作爲隊列。
當事務進入時,只需將其添加到隊列中即可。
程序中的單獨線程位於循環中,該循環從隊列中執行TryTake()
,並具有無限等待超時。無論何時將事務添加到隊列中,該線程都會獲取並處理它,然後返回到下一個。您處理線程的主循環將類似於此:
// Initialized at program startup.
BlockingCollection<Transaction> queue = new BlockingCollection<Transaction>();
// In your thread proc
Transaction trans;
while (queue.TryTake(out trans, Timeout.Infinite))
{
// process transaction
}
// Collection is empty
的TryTake
是一個非忙等待,所以它不會吃的CPU週期。
這應該比基於事件的系統更容易實現,並提供更好的性能。您也不必擔心導致問題的併發事件太多。隊列將緩衝事件,以便儘可能快地處理事務。如果您需要/希望,它還可以讓您創建多個消費者。
例如,要求:
例如,以上面的代碼,並把它變成一個線程PROC:
private void TransactionConsumer()
{
Transaction trans;
while (queue.TryTake(out trans, Timeout.Infinite))
{
// process transaction
}
// Collection is empty
}
還假設您有將東西添加到一些其他的方法隊列。我們會打電話給TransactionProducer
。你的主要程序啓動三個線程:生產者和兩位消費者:
Thread producer = new Thread(TransactionProducer);
Thread consumer1 = new Thread(TransactionConsumer);
Thread consumer2 = new Thread(TransactionConsumer);
producer.Start();
consumer1.Start();
consumer2.Start();
// At this point, you are processing transactions.
// The main thread waits for all threads to exit.
producer.Join();
consumer1.Join();
consumer2.Join();
請注意,如果實際處理事務的方法使用共享資源(像一個普通的日誌文件),那麼你就必須保護那些與一些一種同步(也許是一個鎖)。
沒有足夠的信息來開始猜測。這是不可能回答的。 – Oded 2011-01-20 22:19:12
我同意@dem,這個問題很難對我們負責。它取決於很多事情,唯一可能的答案是:是的,如果做得對,它會很有效率。 – Bobby 2011-01-20 22:20:53