我上一個問題類似工作時無意中發現了同樣的問題。我可以用2個可能的解決方案,1使用一個併發集合爲您的存儲庫和一個門面來更新可觀察集合。 2創建您自己的ConcurrentObservable集合。 2是有風險的,因爲您需要使同步正確,否則會影響性能。我的想法是你可以包裝ConcurrentCollection,然後實現INotifyPropertyChanged。我認爲應該在提高事件之前進行哈希或某種有效的比較。您也可以創建自己的INotifyPropertyChangedAsync事件。只是我的想法。
適配器:
ConcurrentQueue _concurrentQueue = new ConcurrentQueue<object>();
Add(object o)
{
_concurrentQueue.Enqueue(o);
if (!_updateStatus)
{
Task.Run(() => UpdateBindingCollection()).ConfigureAwait(true);
}
}
在UpdateBindingCollection _updateStatus = TRUE,表明我們已經在作品更新的輸入。
void UpdateBindingCollection()
{
while (_concurrentQueue.Count > 0)
{
object o;
_concurrentQueue.Dequeue(out o);
_observableCollection.Add(o);
}
}
容易,但攔截:
Lock(_observableCollection)
{
//Perform update either with add or range.
}
事實上,'ObservableCollection'應該只生活在UI線程(因爲綁定的創建新項目新的'UIElement's)。但是,較新的Framework版本似乎可以解決這個限制。然而,如果你將'Dispatcher'的'ObservableCollection'的每一次改變委託給UI線程,它會不會有幫助? – JeffRSon
的確,我相信這是真正的問題,而不是併發性。我現在正在深入研究它。 –