You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI Blazor应用触屏功能崩溃问题排查求助

问题概述

在Windows 10触摸屏单板计算机上部署的.NET MAUI Blazor应用,偶尔出现仅触屏输入无响应的异常:触摸屏在其他应用中功能正常,通过VNC远程连接或外接键鼠操作应用时也能正常响应,但唯独触屏输入失效,需重启应用才能恢复。该问题在多台设备上均出现,排除单台硬件故障。

触发特征

  • 高频点击资源消耗较大的按钮时,会触发应用完全无响应(含键鼠输入)
  • 日常使用中问题多发生在远程连接设备后,但触发概率不足50%,暂未确认远程工具为必然诱因

捕获到的相关异常

  1. System.Threading.SynchronizationLockException:锁仍在使用时被释放,触发于System.Threading.ReaderWriterLockSlim.Dispose(Boolean disposing)
  2. System.InvalidOperationException:对象当前状态无效,触发于System.Reflection.MemberInfo.get_MetadataToken()
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:52:42