Как мне исправить "Систему.Нарезание резьбы.Задачи.Исключение TaskCanceledException: "Задача была отменена"." Исключение при выходе из приложения (Winforms)?

0

Вопрос

У меня есть настольное приложение для MP3-плеера WinForms (.NET Framework 4.7.2), которое использует ElementHost для размещения элемента управления MediaElement и имеет диспетчер времени для управления воспроизведением (например, обновление слайдера).

Все работает нормально, но когда я выхожу из приложения, я получаю "System.Threading.Tasks.TaskCanceledException: 'A task was canceled.'" исключение (я замечаю это только при запуске под отладчиком).

Это не что иное, как досадная помеха, и кажется в основном безвредным, но мне не нравятся исключения, которых я не понимаю. Стек вызовов не очень полезен:

>   mscorlib.dll!System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task task)   Unknown
    mscorlib.dll!System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task task)  Unknown
    WindowsBase.dll!System.Windows.Threading.DispatcherOperation.Wait(System.TimeSpan timeout)  Unknown
    WindowsBase.dll!System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherOperation operation, System.Threading.CancellationToken cancellationToken, System.TimeSpan timeout)   Unknown
    WindowsBase.dll!System.Windows.Threading.Dispatcher.Invoke(System.Action callback, System.Windows.Threading.DispatcherPriority priority, System.Threading.CancellationToken cancellationToken, System.TimeSpan timeout) Unknown
    WindowsBase.dll!MS.Internal.WeakEventTable.OnShutDown() Unknown
    WindowsBase.dll!MS.Internal.WeakEventTable.WeakEventTableShutDownListener.OnShutDown(object target, object sender, System.EventArgs e)  Unknown
    WindowsBase.dll!MS.Internal.ShutDownListener.HandleShutDown(object sender, System.EventArgs e)  Unknown

Происходит ли это из-за того, что стек WPF каким-то образом не утилизируется должным образом? Я гарантирую, что мой диспетчер времени остановлен в MainForm_FormClosing, но, возможно, есть что-то еще, что мне нужно очистить?

Не критическая проблема, конечно, по раздражению.

c# winforms wpf
2021-11-22 00:41:19
2

Лучший ответ

1

Это исключение возникает, когда асинхронному методу не разрешается выполнять до завершения - для того, чтобы другие асинхронные методы с тем же CancellationToken при необходимости можно изящно остановить обработку.

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

2021-11-22 00:48:57

Есть ли хороший способ определить, какой метод вызывает это исключение? Я бы чувствовал себя лучше, если бы знал, в какой библиотеке это происходит. Стек вызовов во время создания исключений не очень полезен, и, учитывая, что это завершение работы приложения, осталось очень мало запущенных потоков.
David Airapetyan

Вы можете обернуть свой код предложением catch и поместить в него точку останова, чтобы посмотреть, сможете ли вы найти нарушителя в стеке вызовов. К сожалению, если одна из ваших библиотек поймала исключение и повторно выдала новое исключение CancellationException, вы не получите полную историю, и тогда вам лучше всего посмотреть, сможете ли вы погрузиться в источник библиотеки, если он доступен.
Chris
0

Это похоже на проблему с .NET Framework 4.7.2. Проблема и обходной путь описаны здесь: Исключение TaskCanceledException в ShutDownListener.

Проблема в том, что добавление следующего в мое приложение.config привело к исчезновению исключения:

  <runtime>
    <AppContextSwitchOverrides value="Switch.MS.Internal.DoNotInvokeInWeakEventTableShutdownListener=true"/>
  </runtime>
2021-11-22 03:44:26

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................