Переписываю приложение с 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);
}
}