1

我開發了一個數據採購子系統作爲一個DLL,它使用自己的線程捕獲數據並使用ObservableCollections發佈數據。我遇到了幾個問題,因爲這些事件的消費者在接收到ObservableCollection事件時會執行昂貴的操作,這使得我的引擎比預期的要慢。如何分離ObservableCollection?

我打算派在不同的線程中的事件,以避免這個問題,但我有幾個擔心:

public class ObservableCollection2 
{ 
    public void Add() 
    { 
     _internalObservableCollection.Add(); 
     new Thread() { => Raise the event } 
    } 
} 
  1. 這是一個已經解決了問題的標準解決方案?看起來像線程爭用 應該是比較常見的東西。
  2. 使用線程不會嚴重降低 應用程序的性能?
  3. 使用ThreadPool不會使用所有可用的 線程,因爲在子系統中正常發送100到200個 通知每秒?

感謝您的想法。

回答

2

關於這種情況可以做些什麼有幾個想法。

  1. 客戶端不能在事件處理程序中執行繁重的代碼 - 畢竟,他們知道它們阻止了處理。因此,客戶端必須記住集合已更改,並將處理卸載到專用線程中。
  2. 對每個事件使用新線程並不是最佳解決方案。無論如何,如果你這樣做,也許一個線程池線程是一個更好的主意。
  3. 如果有關更改的消息經常發生,也許您想限制通知並將它們發送到更大的包中?我不知道那種即開即用的解決方案,但也許Rx擴展可能會有所幫助。
  4. ObservableCollection是一個相當沉重的類。我個人僅在視圖模型中使用它來綁定視圖,而在模型中,我使用一個自制的類來包含內部的集合,並在需要時發送所需的事件。這樣我可以更好地控制發生的情況。
+0

感謝您的寶貴意見。關於你的想法:1)我無法管理客戶在他們的處理程序上做什麼。 2)我認爲ThreadPool只能提供幾個線程。 3)我會看看這個想法,謝謝。 4)我也喜歡這種方法,再次感謝。 –

+0

@ SoMoS:1)好吧,如果你定義處理程序必須快速,而客戶端不會堅持 - 他們自己有罪,而不是你; 2)是的,但是如果有很多調用,線程的數量會動態地增加,並且無論如何,如果舊的線程沒有完成,你就不應該開始下一個事件 - 所以你只會使用一個線程。也許你可以有一個內部線程並在其中運行一個任務隊列? – Vlad

+0

弗拉德:關於2,你爲什麼認爲我不應該開始下一個活動呢? –