webview2 - 多线程下InvokeRequired始终为 false


现象

  • InvokeRequired始终为false 导致无法更新UI

代码

  • 开发ppt插件的时候,下载文件肯定不能卡住UI线程,一般都会采用代理实现
  • 代码也是普通的,这里就不详细写了
private void SendDownloadInfo(int count, string[] filenames)
{

    if (InvokeRequired)
    {
        // 通知前端下载状态
        foreach (var file in filenames)
        {
            // do something
        }

    }
}

但是实际使用的时候发现 InvokeRequired始终为false, 这时候使用任何UI线程相关都会提示只能在UI线程操作

解决

  • 设置代理的位置不正确
  • 对于webview2 设置代理的时机要在CoreWebView2InitializationCompleted事件触发后
  • 即便设置在await _collection.webView21.EnsureCoreWebView2Async(env);之后 也不行
// 设置WebView2初始化完成事件
webView21.CoreWebView2InitializationCompleted += webView_CoreWebView2InitializationCompleted

// --------------------- //
private void webView_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
    // 挂载下载的代理
    DownloadHelper2.UpdateUIDelegate += SendDownloadInfo;
    // 代理完成回调
    //DownLoadHelper.CollectionTaskCallBack += Accomplish;
}

由于时间关系,真正的原因后面再细挖, 先搬砖了