目前我们看到很多TaskCanceledException
被甩掉MS.Internal.ShutDownListener.HandleShutDown
。这个问题从 5 月中旬开始,可能与 .Net 或 Windows 10 的某些更新有关。我们在软件的旧版本(约 2 年前)和新版本中都看到了这一点,并且它刚刚在所有版本中开始出现。我们的目标是旧版本的 .Net 4 Client 配置文件和较新版本的 .Net 4.5.1。
完整的堆栈跟踪是:
任务取消异常
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在 System.Windows.Threading.DispatcherOperation.Wait(TimeSpan
超时)在
System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherOperation
操作、CancellationToken 取消令牌、TimeSpan 超时)
System.Windows.Threading.Dispatcher.Invoke(操作回调,
DispatcherPriority优先级,CancellationToken取消令牌,
TimeSpan 超时)位于 MS.Internal.WeakEventTable.OnShutDown() 处
MS.Internal.ShutDownListener.HandleShutDown(对象发送者,EventArgs
e)
问题是:是什么造成了这种情况?
目前,我们正在寻找找到根本原因的方法,并最终解决这个问题。当然,我们最终可以简单地捕获它,但这并不是一个实际的解决方案。欢迎任何有关方向的提示。随着我们获得更多见解,我们希望更新此问题,以便能够为以后遇到此问题的人们提供信息。
我也看到过这个。如果您查看源代码 ~278,则关闭期间有一个任意 300 毫秒的时间限制:https://referencesource.microsoft.com/#WindowsBase/Base/MS/Internal/WeakEventTable.cs https://referencesource.microsoft.com/#WindowsBase/Base/MS/Internal/WeakEventTable.cs
try
{
Dispatcher.Invoke((Action)OnShutDown, DispatcherPriority.Send, CancellationToken.None, TimeSpan.FromMilliseconds(300));
succeeded = true;
}
catch (TimeoutException)
{
}
即使 WeakEventTable 中的内部集合全部清空,它也会引发。
无论谁写它都没有预料到运行时抛出TaskCanceledException
因为可能以前从来没有这样过。我采取的解决方法是删除所有对 WeakEventManager 的使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)