.NET MAUI Blazor应用触屏功能崩溃问题排查求助
问题概述
在Windows 10触摸屏单板计算机上部署的.NET MAUI Blazor应用,偶尔出现仅触屏输入无响应的异常:触摸屏在其他应用中功能正常,通过VNC远程连接或外接键鼠操作应用时也能正常响应,但唯独触屏输入失效,需重启应用才能恢复。该问题在多台设备上均出现,排除单台硬件故障。
触发特征
- 高频点击资源消耗较大的按钮时,会触发应用完全无响应(含键鼠输入)
- 日常使用中问题多发生在远程连接设备后,但触发概率不足50%,暂未确认远程工具为必然诱因
捕获到的相关异常
System.Threading.SynchronizationLockException:锁仍在使用时被释放,触发于System.Threading.ReaderWriterLockSlim.Dispose(Boolean disposing)System.InvalidOperationException:对象当前状态无效,触发于System.Reflection.MemberInfo.get_MetadataToken()Microsoft.JSInterop.JSException:无法聚焦无效元素,触发于blazor.webview.js相关方法
推测核心为内部事件处理线程的死锁问题,涉及WebView2或Blazor的触屏事件处理逻辑,以下是可行的缓解措施:
缓解措施
1. 优化WebView2线程模型配置
在Windows平台配置中调整WebView2的线程参数,降低UI线程阻塞风险:
// 在Platforms/Windows/App.xaml.cs的初始化逻辑中添加 var webViewHandler = Microsoft.Maui.Controls.Application.Current?.Windows.FirstOrDefault()? .Page?.FindByName<Microsoft.Maui.Controls.WebView>("MainWebView")?.Handler as Microsoft.Maui.Platform.WebViewHandler; if (webViewHandler?.PlatformView != null) { var creationProps = new Microsoft.Web.WebView2.Core.CoreWebView2CreationProperties(); // 启用多线程合成,分散UI线程压力 creationProps.AdditionalBrowserArguments = "--enable-multithreaded-compositing"; webViewHandler.PlatformView.CreationProperties = creationProps; }
2. 远程连接后重置触屏事件上下文
针对远程连接后的触发特征,在断开远程时强制重置WebView2的触屏事件绑定:
@inject IJSRuntime JS @code { // 检测到远程断开时调用此方法(可结合VNC状态通知或定时检测逻辑) private async Task ResetTouchEventBindings() { try { await JS.InvokeVoidAsync("eval", @" // 重新绑定受影响元素的触屏事件 const resetElements = document.querySelectorAll('video[onclick], .mud-button'); resetElements.forEach(el => { const originalClick = el.onclick; el.onclick = null; el.onclick = originalClick; // 额外重置触屏事件监听 el.removeEventListener('touchstart', el._touchStartHandler); el.addEventListener('touchstart', el._touchStartHandler); }); "); } catch (Exception ex) { // 记录异常日志 } } }
3. 异步化高资源消耗的操作
针对高频点击高资源按钮导致的完全无响应问题,将耗时逻辑移至后台线程:
<MudButton OnClick="@HandleHeavyOperation">高资源操作按钮</MudButton> @code { private async Task HandleHeavyOperation() { // 将耗时逻辑委托给后台线程,避免阻塞UI线程 await Task.Run(() => { // 原高资源消耗业务逻辑 }); // 主线程更新UI await InvokeAsync(StateHasChanged); } }
4. 异常触发时自动重置WebView2
在现有GlobalExceptionHandlers中,捕获到目标异常时自动重启WebView2:
public class GlobalExceptionHandlers { public GlobalExceptionHandlers() { AppDomain.CurrentDomain.UnhandledException += (sender, args) => { var ex = args.ExceptionObject as Exception; if (ex is SynchronizationLockException || ex is InvalidOperationException || ex is JSException jsEx && jsEx.Message.Contains("无法聚焦无效元素")) { ResetWebView2(); } }; } private void ResetWebView2() { var mainWindow = Microsoft.Maui.Controls.Application.Current?.Windows.FirstOrDefault(); if (mainWindow?.Page is MainPage mainPage) { mainPage.Dispatcher.Dispatch(async () => { // 重新加载WebView内容 var mainWebView = mainPage.FindByName<Microsoft.Maui.Controls.WebView>("MainWebView"); if (mainWebView != null) await mainWebView.ReloadAsync(); }); } } }
5. 升级依赖版本
确保使用最新稳定版的.NET MAUI SDK和WebView2运行时,底层线程、事件处理类的问题可能已在新版本中修复:
- 更新.NET MAUI SDK至官方最新稳定版
- 在Windows设备上安装最新的WebView2运行时
内容的提问来源于stack exchange,提问作者jobrien9
相关产品推荐
相关产品推荐

