1

在Silverlight應用程序中,我需要下載大量文件。當一個文件完成下載時,我需要更新一個ObservableCollection對象。這是我使用的代碼:在Silverlight中訪問單個ObservableCollection的多種異步方法

private void downloadFiles(List<string> files) 
{ 
    foreach (var file in files) 
    { 
     string _file = file; 

     new WebClient().OpenReadTaskAsync(new Uri(_file)).ContinueWith(t1 => 
     { 
      Stream stream = t1.Result; 
      byte[] buffer = new byte[stream.Length]; 
      stream.ReadAsync(buffer, 0, (int)stream.Length).ContinueWith(t2 => 
      { 
       myObservableCollection.Add(_file); //An Exception is thrown.      
      }); 
     }); 
    } 
} 

當試圖添加到myObservableCollection拋出一個異常:
一個CollectionChanged和PropertyChanged事件期間無法更改的ObservableCollection。

解決這個問題的一種方法是在每個OpenReadTaskAsync上等待,但是我不會最大化I/O。我還遇到了一個ReaderWriterLock,它看起來可以提供幫助,但不幸的是它在Silverlight中不可用。

我該如何處理這個問題?

回答

0

您可以序列使用該UI線程上更新ObservableCollection

string _file = file; 
var ui = TaskScheduler.FromCurrentSynchronizationContext(); 

... 

.ContinueWith(t2 => 
    { 
     myObservableCollection.Add(_file); //An Exception is thrown.      
    } 
    , ui);