Диспетчер WPF {“Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им”.}

сначала я должен сказать, что я - новичок с WPF и C#. Приложение: Создайте Изображение Mandelbrot (GUI), Мой диспетчер работает отлично этот этот случай:

  private void progressBarRefresh(){

       while ((con.Progress) < 99)
       {
           progressBar1.Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate
                {
                    progressBar1.Value = con.Progress;
                }
              ));
       }
  }

Я заставляю сообщение (Заголовок) когда Тринг делать это с ниже кода:

bmp = BitmapSource.Create(width, height, 96, 96, pf, null, rawImage, stride);

this.Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate
            {                     
                img.Source = bmp;
                ViewBox.Child = img;  //vllt am schluss
            }
          ));

Я попытаюсь объяснить, как моя программа работает. Я создал новый поток (потому что GUI не делает ответа) для вычисления пикселей и цветов. В этом Потоке (Метод) я использую Диспетчера для Обновления моего Изображения в ViewBox после того, как вычисления будут готовы.

Когда я не помещаю вычисление в отдельный Поток затем, я могу обновить или создать свое Изображение.

16
задан Benjamin 5 November 2013 в 11:45
поделиться

3 ответа

MSDN сообщает: «Замороженный файл Freezable можно использовать в нескольких потоках».

Возможно, этот поток поможет: http://social.msdn.microsoft.com/Forums/ en-US / windowswic / thread / 9223743a-e9ae-4301-b8a4-96dc2335b686

7
ответ дан 30 November 2019 в 16:18
поделиться

Вы также можете использовать механизм очередей для передачи сообщений между потоками. В конце концов, так устроена архитектура Windows. Вот что делает диспетчер. Вы передаете ссылку в делегат, который не принадлежит потоку WPF.

Итак, да, основная идея у вас есть, но вам нужно передать растровое изображение в другой поток, используя Action (T object) , или в вашем случае:

Dispatcher.Invoke(DispatcherPriority.Send, new Action<Bitmap>(delegate(Bitmap img) {
    do things here...
}), bmp);
2
ответ дан 30 November 2019 в 16:18
поделиться

Вы создаете растровое изображение ( bmp ) в своем рабочем (?) Потоке, а затем передаете его потоку пользовательского интерфейса - вот это и происходит сбой.

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

2
ответ дан 30 November 2019 в 16:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: