2012-08-28 42 views
2

我有一堂課以相當快的頻率(每100ms)發起一次活動。爲了避免減慢這個過程,事件處理程序應該將處理交給某種後臺任務/線程/工作者(而不是在事件處理程序中完成)。如何處理後臺線程上的事件?

什麼是最好的方法?我應該在事件處理程序中使用Task.Factory.StartNew嗎?會不會有快速創建任務的開銷(例如5個事件處理程序會每100毫秒創建5個任務)?或者我可以使用BackgroundWorker(在訂戶的構造函數中實例化),並在事件處理程序中調用.RunAsync方法?

回答

3

兩種方式:

  • 要麼使用Task.Factory.StartNew。此方法依賴於ThreadPool來最小化任務創建成本。在大多數情況下,這應該可以。
  • 如果您需要進一步降低性能影響,可以創建生產者/消費者隊列。當事件被觸發時,排隊通知。另一方面,線程監視隊列並在通知到達時處理它們。
+1

如果您需要按順序處理事件,第二個選項也很有用。 'BlockingCollection (new ConcurrentQueue ())' – Jodrell