如何解决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
相关产品推荐
相关产品推荐

