В моем приложении у меня есть задача, которая выполняется в фоновом режиме для выполнения длительной работы. Пользователь может отменить работу в любое время, нажав кнопку Стоп. Реализация выглядит следующим образом:
private CancellationTokenSource m_tokenSource;
private void onStop()
{
m_tokenSource.Cancel();
}
private void onStart()
{
m_tokenSource = new CancellationTokenSource();
AsyncDoingJob();
}
private async void AsyncDoingJob()
{
await Task.Run(() =>
{
for (int imgIdx = 0; imgIdx < m_ListImageFiles.Count; imgIdx++)
{
if (m_tokenSource.IsCancellationRequested) // Check if the user clicks Stop button
{
return;
}
byte[] imageData = File.ReadAllBytes(m_ListImageFiles[imgIdx]); // Load image in background
Application.Current.Dispatcher.Invoke(() =>
{
m_model.Image = CreateImage(imageData);
m_model.Image.Freeze();
MyImage = m_model.Image; // This calls NotifyPropertyChanged() to update the image on GUI
}
// Access to m_model.Image for some reason
}
}, m_tokenSource.Token);
}
Проблема: иногда во время выполнения задания графический интерфейс перестает обновляться (зависает). И если я пытаюсь манипулировать графическим интерфейсом, возникает исключение: System.Runtime.InteropServices.COMException: UCEERR_RENDERTHREADFAILURE (Исключение из HRESULT: 0x88980406)
Я обнаружил похожую проблему, о которой здесь сообщалось: Сбои потока рендеринга WPF
Знаете ли вы, что это такое и как это исправить? Что-то не так с моим исходным кодом?