From 2acc7ada30925b1346475d748d15ceb085fd1dea Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 15 Nov 2025 19:31:57 +0800 Subject: [PATCH] =?UTF-8?q?improve:=E9=94=99=E8=AF=AF=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/App.xaml.cs | 44 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/Ink Canvas/App.xaml.cs b/Ink Canvas/App.xaml.cs index 51ea0265..a759d4f9 100644 --- a/Ink Canvas/App.xaml.cs +++ b/Ink Canvas/App.xaml.cs @@ -346,6 +346,25 @@ namespace Ink_Canvas try { var exception = e.ExceptionObject as Exception; + + if (exception is InvalidOperationException invalidOpEx) + { + string exceptionMessage = invalidOpEx.Message ?? ""; + string exceptionStackTrace = invalidOpEx.StackTrace ?? ""; + + if (exceptionMessage.Contains("调用线程无法访问此对象") || + exceptionMessage.Contains("because another thread owns it") || + exceptionStackTrace.Contains("DynamicRenderer") || + exceptionStackTrace.Contains("CompositionTarget.get_RootVisual")) + { + LogHelper.WriteLogToFile( + $"检测到DynamicRenderer线程访问异常: {invalidOpEx.Message}", + LogHelper.LogType.Warning + ); + return; + } + } + string errorMessage = exception?.ToString() ?? "未知异常"; lastErrorMessage = errorMessage; @@ -549,6 +568,31 @@ namespace Ink_Canvas private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { + // 检查是否是DynamicRenderer线程访问UI对象的已知问题 + if (e.Exception is InvalidOperationException invalidOpEx) + { + string exceptionMessage = invalidOpEx.Message ?? ""; + string exceptionStackTrace = invalidOpEx.StackTrace ?? ""; + + // 检查是否是DynamicRenderer相关的线程访问问题 + if (exceptionMessage.Contains("调用线程无法访问此对象") || + exceptionMessage.Contains("because another thread owns it") || + exceptionStackTrace.Contains("DynamicRenderer") || + exceptionStackTrace.Contains("CompositionTarget.get_RootVisual")) + { + // 这是WPF InkCanvas的已知问题,DynamicRenderer的后台线程尝试访问UI对象 + // 这个异常不会影响应用程序功能,可以安全地忽略 + LogHelper.WriteLogToFile( + $"检测到DynamicRenderer线程访问异常(已安全处理): {invalidOpEx.Message}", + LogHelper.LogType.Warning + ); + + // 标记为已处理,不显示错误消息,不触发重启 + e.Handled = true; + return; + } + } + Ink_Canvas.MainWindow.ShowNewMessage("抱歉,出现未预期的异常,可能导致 InkCanvasForClass 运行不稳定。\n建议保存墨迹后重启应用。"); LogHelper.NewLog(e.Exception.ToString());