Асинхронные операции на WriteableBitmap
Я пишу приложение в WPF (C #), которое выполняет длинные операции над коллекцией растровых изображений. Чтобы обеспечить отзывчивость моего приложения, я решил использовать другой поток для выполнения операций с растровыми изображениями и сообщать о ходе выполнения на панели прогресса в основном потоке пользовательского интерфейса. Я думал, что BackgroundWorker сделает что-нибудь для меня, но, похоже, это будет не так просто.
У меня есть следующий код:
public class ImageProcessor
{
public Collection<WriteableBitmap> Pictures { get; private set; }
private BackgroundWorker _worker = new BackgroundWorker();
public ImageProcessor()
{
_worker.DoWork += DoWork;
}
public void DoLotsOfOperations()
{
_worker.RunWorkerAsync();
}
private void DoWork(object sender, DoWorkEventArgs e)
{
// operations on Pictures collection
}
}
Во время выполнения я загружаю изображения, используя стандартный диалог открытия файла, в коллекцию Pictures, а затем вызываю метод DoLotsOfOperations (). Но как только я пытаюсь получить доступ к любому из свойств одного растрового изображения, я получаю InvalidOperationException: «Вызывающий поток не может получить доступ к объекту, потому что другой поток владеет им».
Это очевидно: я загрузил растровые изображения и заполнил коллекцию в потоке пользовательского интерфейса, и я пытаюсь прочитать элементы коллекции в другом потоке. Поэтому я попробовал разные подходы:
Я передал всю коллекцию как параметр метода RunWorkerAsync и вернул ее обратно в метод DoWork из e.Argument, но затем, когда я попытался прочитать свойства одного растрового изображения, я все еще получил то же исключение.Я пробовал то же самое, на этот раз передавая одно растровое изображение в качестве аргумента фонового работника, и все же я не мог получить ни одно из свойств растрового изображения, не говоря уже о пикселях растрового изображения.Итак, как я могу получить доступ к данным растрового изображения в другом потоке (и желательно с помощью BackgroundWorker)?
Я не знаю, может быть, весь мой подход неверен. Общая идея, которую я хочу достичь:
Пользователь загружает растровые изображения, которые затем отображаются в окне.Пользователь нажимает кнопку, и выполняется длинная операция с растровыми изображениями, но пользовательский интерфейс отзывчив (что позволяет пользователю, например, отменить операцию), а ход выполнения отображается на панели прогресса.Заранее благодарю за любую помощь.