Jak mohu opravit "Systém.Řezání závitů.Úkoly.TaskCanceledException: 'úkol byl zrušen.'" výjimkou na app exit (Winforms)?

0

Otázka

Mám WinForms MP3 přehrávač desktop aplikace (.NET Framework 4.7.2), který je pomocí ElementHost hostit MediaElement ovládání a má DispatcherTimer pro ovládání přehrávání (jako je například aktualizace Jezdce).

Všechno funguje v pohodě, ale když jsem se opustit aplikaci, jsem si "System.Threading.Tasks.TaskCanceledException: 'A task was canceled.'" výjimkou (všiml jsem si, že pouze tehdy, když běží pod ladicí program).

Není to nic, ale na obtíž a je většinou neškodný, ale nemám rád výjimky, které nerozumím. Zásobník není super užitečné:

>   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

Se to děje, protože WPF zásobníku není zlikvidován správně nějak? Zajistit DispatchTimer je zastaven v MainForm_FormClosing ale možná tam je ještě něco, co musím uklidit?

Není zásadní problém, samozřejmě, nepříjemné.

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

Nejlepší odpověď

1

Tato Výjimka je vyvolána, když je asynchronní metoda není dovoleno běžet k dokončení - v pořadí, že další asynchronní metody se stejným CancellationToken může zastavit zpracování elegantně, v případě potřeby.

Můžete pravděpodobně ignorovat to, jak se zdá být při nezachycené výjimce z jednoho z těch knihoven, které používáte. Pokud to opravdu vadí a víš, že to není ve vašem codebase, můžete namočit Výjimky, ale obecně to není považováno za dobré praxe.

2021-11-22 00:48:57

Je tam dobrý způsob, jak zjistit, který způsob je příčinou této výjimky být hozen? Cítil bych se líp, kdybych věděl, které knihovna je způsobuje. Zásobník na výjimky házení čas není velmi užitečné, a vzhledem k tomu, že je aplikace, vypnutí, existuje jen velmi málo spuštěných podprocesů vlevo.
David Airapetyan

Můžete zabalit svůj kód s catch klauzule, a dát zarážku na to, aby zjistili, zda můžete najít pachatele v zásobníku volání. Bohužel, pokud se jeden z vašich knihoven má zachycenou Výjimku a znovu hodil nový CancellationException, nebudete získat plnou historii, a vaše nejlepší sázka, pak je vidět, jestli se můžete ponořit do zdroje knihovny, pokud je k dispozici.
Chris
0

Vypadá to, že problém s .NET Framework 4.7.2. Problém a řešení jsou popsány zde: TaskCanceledException v ShutDownListener.

Tl'dr je, že přidáním následující do mé Aplikace.config výjimku jít pryč:

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

V jiných jazycích

Tato stránka je v jiných jazycích

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