@da_normalny_ya

Почему Dispatcher.Invoke работает не для всех Control?

Переписываю приложение с WinForm на WPF и столкнулся со странной работой Invoke.
Есть метод который вызывается через
Task.Factory.StartNew(ThreadFunc, TaskCreationOptions.LongRunning);

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

Собственно вопрос как это заставить работать нормально и возможно ли реализовать обновление изображения при помощи привязки данных?
MemoryStream ms = null;
while (true)
{
    if (_token.IsCancellationRequested) return;
                
    ms?.Dispose();
    _client.GetNextMessage(out var msg);
    if (msg.eventType == EventType.Data)
    {
        ms = new MemoryStream(msg.data);
        _bitmapImage = new BitmapImage();
        _bitmapImage.BeginInit();
        _bitmapImage.StreamSource = ms;
        _bitmapImage.EndInit();
        Dispatcher.Invoke(() =>
        {
            pictureBox.Source = _bitmapImage;
        });
    }
    else if (msg.eventType == EventType.Disconnected)
    {
        _cancelTokenSource.Cancel();

        Dispatcher.Invoke(() =>
        {
            Connect.IsEnabled = true;
            Disconnect.IsEnabled = false;
            pictureBox.Source = null;
        });
        MessageBox.Show("Трансляция закончилась или вы были отключены!", "Уведомление",
            MessageBoxButton.OK, MessageBoxImage.Asterisk);
        }
}
  • Вопрос задан
  • 146 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Sumor
Из кода не видно откуда берётся Dispatcher .
Он должен указывать на диспетчер потока WPF - в любом обработчике событий WPF присвойте этой переменной значение CurrentDispatcher и вышеприведённый код заработает нормально.
Или взять pictureBox.Dispatcher для этого
Ответ написан
Ваш ответ на вопрос

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

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