@maranqz

Доступ из другого потока, зависание Invoke, как решить?

Есть функция, которая записывается в Action.
void videoRecieved(Google.Apis.YouTube.v3.Data.Video video)
        {
            Debug.WriteLine(video.Id);

            this.Invoke((Action)(
                () => progressBar.Value = progressBar.Maximum
            ));

            Debug.WriteLine(video.Id);
        }

В ней есть строка в которой изменяется значение progressBar.
Я ее вызываю через invoke , тем самым вызывая новый поток, но этот поток почему то не завершается и вся программа останавливается и не идет дальше.
Если что, данная функция передается два раза. Передается сначала Одному классу(А1), а потом А1 передает следующему классу А2.
Что я делаю не так?)
  • Вопрос задан
  • 893 просмотра
Пригласить эксперта
Ответы на вопрос 3
@raincons
Invoke() вызывает событие не в новом потоке, а в главном GUI потоке приложения, и ждет, пока событие будет отработано. Вероятно, GUI поток чем-то занят и не может отработать событие. Ну или GUI поток при изменении progressBar.Value должен что-то сделать с video, но сделать этого не может, потому что поток video блокирован ожиданием GUI потока.
вариант 1: разобраться, чем занят или блокирован GUI поток;
вариант 2: использовать BeginInvoke() - вызвать событие, но не ждать. Тогда вызывающий поток не блокируется, но нет никакой гарантии, что по выходу из BeginInvoke() progressBar.Value уже изменило свое значение, и вообще изменит его когда-нибудь.

Да, вместо this.Invoke((Action)(..) лучше писать progressBar.Invoke((Action)(..), вам же progressBar надо менять - значит в его потоке это и надо делать.
Ответ написан
lexxpavlov
@lexxpavlov
Программист, преподаватель
Вопрос в том, в каком потоке вызывается эта функция.
Вместо this.Invoke поставьте Dispatcher.BeginInvoke.
Ответ написан
Комментировать
@MonkAlex
C#, SQL, Delphi, C++ etc
А ещё лучше использовать биндинги в wpf и не задумываться о каких то там инвоках.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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