【问题标题】:How do I fix the "System.Threading.Tasks.TaskCanceledException: 'A task was canceled.'" exception on app exit (Winforms)?如何修复应用程序退出(Winforms)上的“System.Threading.Tasks.TaskCanceledException:'任务已取消。'”异常?
【发布时间】:2021-12-31 16:50:13
【问题描述】:

我有一个 WinForms MP3 播放器桌面应用程序 (.NET Framework 4.7.2),它使用 ElementHost 来承载 MediaElement 控件,并有一个 DispatcherTimer 来控制播放(例如更新 Slider)。

一切正常,但是当我退出应用程序时,我得到了"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 堆栈没有以某种方式正确处理吗?我确保我的 DispatchTimer 在 MainForm_FormClosing 中停止,但也许我还需要清理其他东西?

当然,烦人不是一个关键问题。

【问题讨论】:

  • 也许添加许多 未处理的异常 处理程序之一。或者清除 Debug > Windows > Exception settings 中的所有 first chance 设置选项

标签: c# wpf winforms


【解决方案1】:

当一个异步方法不允许运行完成时抛出此异常 - 以便具有相同 CancellationToken 的其他异步方法可以在需要时正常停止处理。

您可能会忽略它,因为它似乎是您正在使用的其中一个库中未捕获的异常。如果它真的困扰你并且你知道它不在你的代码库中,你可以浸泡异常,但这通常不是好的做法。

【讨论】:

  • 有什么好的方法可以找出是哪个方法导致了这个异常被抛出?如果我知道是哪个库导致它,我会感觉更好。抛出异常时的调用堆栈不是很有用,而且考虑到它是应用程序关闭,剩下的运行线程非常少。
  • 您可以使用 catch 子句包装您的代码,并在其上放置一个断点,看看您是否可以在调用堆栈中找到违规者。不幸的是,如果您的某个库捕获了一个异常并重新抛出了一个新的 CancellationException,您将无法获得完整的历史记录,那么您最好的选择是查看是否可以深入了解该库的源代码(如果可用)。
【解决方案2】:

这看起来像是 .NET Framework 4.7.2 的问题。此处描述了问题和解决方法:TaskCanceledException in ShutDownListener

tl'dr 是在我的 App.config 中添加以下内容会使异常消失:

  <runtime>
    <AppContextSwitchOverrides value="Switch.MS.Internal.DoNotInvokeInWeakEventTableShutdownListener=true"/>
  </runtime>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多