2011-04-20 59 views
2

我想加載我的CollectionViewSource異步。所以我寫了這樣的代碼:如何從任務更新CollectionViewSource的Source屬性?

list1 = new List<int>(); 
list2 = new List<int>(); 

Task.Factory.StartNew<Tuple<List<int>, List<int>>>(() => 
{ 
    // Create and return tuple with 2 lists 
}).ContinueWith(doneTask => 
{ 
    list1 = doneTask.Result.Item1; 
    list2 = doneTask.Result.Item2; 
    // update UI 
    collectionViewSource1.Source = list1; 
    collectionViewSource2.Source = list2; 
}, TaskScheduler.FromCurrentSynchronizationContext()); 

但是這段代碼不起作用。

發生異常System.ArgumentException: Must create DependencySource on same Thread as the DependencyObject.

回答

1

DependencyObjects具有線程關聯性,您不能在後臺線程上修改它們。你應該能夠做到這一點使用應用程序的調度程序是這樣的:

App.Current.Dispatcher.Invoke((Action)delegate 
{ 
    collectionViewSource1.Source = list1; 
    collectionViewSource2.Source = list2; 
}, null); 

article on MSDN可能會提供更多的相關信息。

+0

@ H.B .:此代碼不起作用。它引發了同樣的例外。 – 2011-04-20 07:24:13

+0

你可以固定它發生的代碼行嗎? – 2011-04-20 07:28:56

+0

@ H.B .:我的調試器在異常發生時不顯示代碼行,但如果我註釋這兩行:collectionViewSource1.Source = list1; collectionViewSource2.Source = list2,代碼工作正常。我甚至可以更新UI,但無法更新此綁定。 – 2011-04-20 07:34:06