Несколько асинхронных методов, которые обращаются к одному ObservableCollection в Silverlight - PullRequest
1 голос
/ 10 декабря 2011

В приложении 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 выбрасывается исключение:
Невозможно изменить ObservableCollection во время события CollectionChanged или PropertyChanged.

Один из способов исправить это дождаться каждого OpenReadTaskAsync, но тогда я не буду максимизировать ввод-вывод.Я также натолкнулся на ReaderWriterLock, который, похоже, может помочь, но, к сожалению, его нет в Silverlight.

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 10 декабря 2011

Вы можете сериализовать обновление ObservableCollection в потоке пользовательского интерфейса, используя это:

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

...

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