weixin_42196168 2024-06-13 11:49 采纳率: 33.3%
浏览 33
已结题

多线程中使用webview2的CoreWebView2中的ExecuteScriptAsync执行js刷新前端数据,

#多线程中使用webview2的CoreWebView2中的ExecuteScriptAsync执行js刷新前端数据,后端执行了ExecuteScriptAsync函数,前端却没有响应
#

img

#代码如上,我是想开启一个并线线程,执行完后,返回消息给前端,通过ExecuteScriptAsync刷新前端的数据模型
#.net core6 winform和webview2

  • 写回答

2条回答 默认 最新

  • 关注

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    根据你提供的代码,你希望在多线程中使用CoreWebView2中的ExecuteScriptAsync方法执行JavaScript来刷新前端数据,并通过ExecuteScriptAsync方法刷新前端的数据模型。

    首先,需要确保在刷新前端数据之前,CoreWebView2已经初始化完成。可以通过EnsureCoreWebView2Async方法来确保CoreWebView2已经准备好使用。

    接下来,根据你的需求,在后台线程中执行JavaScript,并使用ExecuteScriptAsync方法来刷新前端数据。在执行之前,需要等待CoreWebView2初始化完成。可以使用CoreWebView2InitializationCompleted事件来监听CoreWebView2初始化完成的事件。

    另外,需要注意的是,ExecuteScriptAsync方法只能在UI线程中使用,不能在后台线程中直接调用。所以需要在后台线程中通过Invoke或者其他方式将执行脚本的操作传递给UI线程去执行。

    以下是修改后的代码示例:

    private async Task RefreshMainBuyScript(string rowJson)
    {
        await _webView2.EnsureCoreWebView2Async(); // 确保 CoreWebView2 已经准备好使用
        
        await _webView2.CoreWebView2InitializationCompleted; // 等待 CoreWebView2 初始化完成
    
        // 在UI线程中执行 ExecuteScriptAsync 方法
        await _webView2.InvokeAsync(async () =>
        {
            await _webView2.CoreWebView2.ExecuteScriptAsync($"setRefreshMainBuyRow('{rowJson}')");
        });
        
        // 在UI线程中执行 ExecuteScriptAsync 方法
        await _webView2.InvokeAsync(async () =>
        {
            await _webView2.CoreWebView2.ExecuteScriptAsync("alert('333333333333')");
        });
        
        // 在UI线程中执行 AddScriptToExecuteOnDocumentCreatedAsync 方法
        await _webView2.InvokeAsync(async () =>
        {
            await _webView2.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync("alert('44444444444')");
        });
    }
    

    需要注意的是,上述代码中使用了WebView2InvokeAsync方法来在UI线程中执行操作,确保ExecuteScriptAsync方法在UI线程中被调用。

    在调用RefreshMainBuyScript方法时,需要在后台线程中执行。具体可以使用Task.Run方法来创建一个后台任务。

    var result = await Task.Run(async () => 
    {
        await RefreshMainBuyScript(item.ToJsonCamel(true));
        // 这里可以处理执行完成后的逻辑,并返回给前端
        return result;
    });
    

    希望这样的解决方案对你有帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 6月13日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见