C# Windows Forms调用BringToFront出现跨线程操作无效错误如何解决
问题原因
CefSharp的LoadingStateChanged事件默认在CEF内部工作线程触发,不属于WinForm程序的UI线程。而WinForm规定所有控件的属性修改、方法调用都必须在创建该控件的UI线程执行,直接在事件回调中操作bunifuLoader1等控件就会触发跨线程访问无效异常。
解决方案
通过WinForm控件的InvokeRequired属性判断是否需要跨线程封送,再用BeginInvoke将UI操作提交到UI线程执行即可,修改后的代码如下:
private void ChromiumWebBrowser1_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e) { // 检测是否需要跨线程调用UI线程 if (bunifuCards1.InvokeRequired) { // 异步将操作提交到UI线程执行,不会阻塞浏览器工作线程 bunifuCards1.BeginInvoke(new Action(() => { UpdateLoadingUi(e.IsLoading); })); return; } // 已在UI线程,直接执行UI操作 UpdateLoadingUi(e.IsLoading); } // 封装UI更新逻辑,避免重复代码 private void UpdateLoadingUi(bool isLoading) { if (bunifuCards1.Contains(bunifuLoader1)) { if (isLoading) { bunifuLoader1.BringToFront(); } else { bunifuImageButton4.BringToFront(); } } }
补充说明
- 该场景使用
BeginInvoke异步执行即可,不会阻塞CEF的加载流程,性能更优。 - 如果需要等待UI操作完成后再执行后续逻辑,可以替换为同步调用
Invoke。
内容的提问来源于stack exchange,提问作者Buddoset Gaming
相关产品推荐
相关产品推荐

