Winforms应用退出时出现System.Threading.Tasks.TaskCanceledException异常如何修复?
异常成因
这个异常确实是WPF栈资源未有序释放导致的。从调用栈可以看出,异常触发在WPF内部WeakEventTable的关闭流程:应用退出时WPF运行时清理弱事件表,需要向WPF调度器同步派发任务,但此时调度器已经开始销毁,相关任务被取消就抛出了该异常。因为它属于WPF框架内部的第一方异常,只有调试器默认会捕获这类异常,所以仅调试时会触发,正常运行不会暴露,也不会影响功能。
需要补充的清理步骤
你已经停止了DispatcherTimer,还需要在MainForm_FormClosing事件中按顺序执行以下清理操作:
- 先释放
MediaElement的媒体资源:
// 停止当前播放 mediaElement.Stop(); // 清空媒体源 mediaElement.Source = null; // 关闭媒体实例 mediaElement.Close();
- 卸载并销毁
ElementHost资源:
// 移除WPF子控件 elementHost.Child = null; // 释放ElementHost托管资源 elementHost.Dispose();
- 主动关闭WPF调度器,等待所有待处理任务执行完毕:
System.Windows.Threading.Dispatcher.CurrentDispatcher.InvokeShutdown();
临时调试规避方案
如果暂时不想修改业务代码,可以在VS调试器的异常设置中,配置System.Threading.Tasks.TaskCanceledException仅当用户代码未处理时才中断,或者直接排除该异常的调试捕获,即可消除调试干扰。
内容的提问来源于stack exchange,提问作者David Airapetyan
相关产品推荐
相关产品推荐

