You need to enable JavaScript to run this app. 如何解决CefSharp的FrameLoadEnd事件中修改WinForms Label属性的跨线程报错
优惠活动
大模型
产品
解决方案
定价
更多

如何解决CefSharp的FrameLoadEnd事件中修改WinForms Label属性的跨线程报错

问题原因

  • CefSharp的FrameLoadEnd事件回调是在非UI工作线程中触发的,而WinForm控件的属性修改操作只允许在创建该控件的UI线程中执行,直接在回调里修改Label的Visible属性就会触发跨线程操作无效的报错:

System.InvalidOperationException: 'Cross-thread operation not valid: Control 'Loading' accessed from a thread other than the thread it was created on.'

解决方法

只需要把修改UI的逻辑通过控件的Invoke方法封送到UI线程执行即可,修改后的OnBrowserFrameLoadEnd代码如下:

private void OnBrowserFrameLoadEnd(object sender, FrameLoadEndEventArgs args)
{
    CustomWebBrowser wb = (CustomWebBrowser)sender;

    if(wb.Label != null)
    {
        // 判断是否需要跨线程调用
        if (wb.Label.InvokeRequired)
        {
            // 将操作封送到UI线程执行
            wb.Label.Invoke(new Action(() => 
            {
                wb.Label.Visible = false;
                MessageBox.Show("Done");
            }));
        }
        else
        {
            // 已经处于UI线程可直接操作
            wb.Label.Visible = false;
            MessageBox.Show("Done");
        }
    }
}

如果不需要做线程判断,也可以直接调用Invoke,当前WinForm版本在UI线程直接调用Invoke也不会产生额外性能问题,简化写法如下:

private void OnBrowserFrameLoadEnd(object sender, FrameLoadEndEventArgs args)
{
    CustomWebBrowser wb = (CustomWebBrowser)sender;
    wb.Label?.Invoke(new Action(() => 
    {
        wb.Label.Visible = false;
        MessageBox.Show("Done");
    }));
}

内容的提问来源于stack exchange,提问作者Kobby Khaisian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 12:00:05