Как получить доступ к UI с фонового потока? [дубликат]

201
06 апреля 2019, 08:20

На данный вопрос уже ответили:

  • Работа с контролами из фонового потока 2 ответа
  • WPF невозможно обновить элемент окна 2 ответа

Если урезать код и избежать модели MVVM, то вот что пытаюсь сделать:

public MainWindow(MainViewModel mainViewModel)
{
        this.InitializeComponent();
        // ...
        Thread bgThread = new Thread(new ThreadStart(DoSomeUIActions));
        bgThread .Start();
    }
private void DoSomeUIActions()
 {
         Queue<KeyValuePair<string, string>> somePairs = new Queue<KeyValuePair<string, string>>();
        // инициализация очереди
        try
        {
            while (true)
            {
                KeyValuePair<string, string> tmp = somePairs.Peek();
                BitmapImage img = new BitmapImage();
                img.BeginInit();
                img.UriSource = new Uri(tmp.Value);
                img.EndInit();
                Application.Current.Dispatcher.Invoke(new Action(() => {
                    if (img.CanFreeze)
                    {
                        img.Freeze();
                    }
                    this.someImageOnWindow.Source = img;
                 }), DispatcherPriority.ContextIdle);
                this.myWindowInnerProperty= tmp.Key;
                somePairs.Enqueue(tmp);
                Thread.Sleep(10000);
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

В итоге вылетает исключение The calling thread cannot access this object because a different thread owns it. Не могу понять в чём проблема и как её решить. Поможете?

Answer 1

Попробуйте так использовать Dispatcher: создавать картинку в основном потоке.

    App.Current.Dispatcher.BeginInvoke((Action)(() =>
                                {
                BitmapImage img = new BitmapImage();
                img.BeginInit();
                img.UriSource = new Uri(tmp.Value);
                img.EndInit();
                if (img.CanFreeze)
                    {
                        img.Freeze();
                    }
                    this.someImageOnWindow.Source = img;
                    myWindowInnerProperty= tmp.Key;
                                }));
READ ALSO
Gif изображение в Android Xamarin

Gif изображение в Android Xamarin

Есть метод для появления Gif

179
Упростить код десериализации

Упростить код десериализации

Помогите упростить кодНаверно, это можно сделать через LINQ или как-то ещё

161
Архитектура авторизации в приложении

Архитектура авторизации в приложении

Мое приложение авторизовываться с помощью одного метода Authorize в сервисе wcfАргумент ы метода - логин, пароль, параметры машины пользователя...

146
Работа с SqlCommandBuilder

Работа с SqlCommandBuilder

У меня есть 2 таблицы, хочу добавить по строке в каждую и передать изменения в БДПользуюсь при этом SqlCommandBuilder

173