Асинхронные операции на 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)?

Я не знаю, может быть, весь мой подход неверен. Общая идея, которую я хочу достичь:

Пользователь загружает растровые изображения, которые затем отображаются в окне.Пользователь нажимает кнопку, и выполняется длинная операция с растровыми изображениями, но пользовательский интерфейс отзывчив (что позволяет пользователю, например, отменить операцию), а ход выполнения отображается на панели прогресса.

Заранее благодарю за любую помощь.

Ответы на вопрос(2)

Ваш ответ на вопрос