網站首頁 編程語言 正文
C#報錯System.InvalidOperationException
問題場景
在C# Windows GUI編程中,從某個子線程去訪問設計器中的某個控件,例如將某個按鈕禁用。這樣就會觸發該異常:
System.InvalidOperationException:"線程間操作無效: 從不是創建控件"btn_exp"的線程訪問它。"
問題原因
在C# Windows GUI編程中有一個規則,就是只能通過創建控件的線程來訪問控件,否則就可能產生不可預料的結果。
解決方案
方案一,打破規則
在構造函數中加入以下語句:
Control.CheckForIllegalCrossThreadCalls = false;
將以上屬性設置為假則會取消對非法跨線程調用進行檢查,簡單粗暴但不保證不出錯。
方案二,利用委托(Delegate)
.net為我們提供了Invoke 方法與BeginInvoke方法去調用委托,它們的區別在于前者是線程阻塞的,后者是異步的。
因此當委托是一個較為耗時的函數時,Invoke 方法就會導致線程阻塞,表現為用戶界面卡頓;而BeginInvoke方法則不會等待委托執行完畢。
雖然BeginInvoke方法不會導致線程阻塞,但可以使用EndInvoke方法或者其它類似WaitHandle機制等待異步操作的完成。
BeginInvoke(new MethodInvoker(()=>
{
? ? btn_exp.Enabled = false;
}));
其中,MethodInvoker委托 與EventHandler 委托的區別在于前者是不帶參數的:
public delegate void MethodInvoker();
public delegate void EventHandler(object sender, EventArgs e);
c# WPF InvalidOperationException異常的幾種常見原因
什么是InvalidOperationException
操作無效異常。當方法調用對對象的當前狀態無效時引發的異常。
繼承
- Object
- Exception
- SystemException
詳細說明
如果調用方法失敗是由無效參數以外的其他原因導致的,則使用該異常。通常, 當對象的狀態不支持方法調用時, 將引發此異常。
例如, 以下方法或原因會引發異常nvalidOperationException:
- IEnumerator.MoveNext如果在創建枚舉器后修改集合的對象,。
- ResourceSet.GetString如果在執行方法調用前關閉資源集,。
- XContainer.Add如果要添加的對象將導致結構不正確的 XML 文檔,。
- 嘗試從非主線程或 UI 線程的線程操作 UI 的方法。
- 從非 UI 線程更新 UI 線程(跨UI線程調用,樓主就是因為這個原因,在線程里調用的UI控件導致報錯!)
- 在循環訪問集合時更改集合
- 對其對象無法進行比較的數組或集合進行排序
- 將為 null <T>轉換為其基礎類型
- 對空集合調用 system.exception 方法
- 對沒有一個元素的序列調用 SingleOrDefault 或可枚舉的。
- 動態跨應用程序域字段訪問
由于InvalidOperationException異常可以在多種情況下引發,因此讀取由message屬性返回的異常消息非常重要。
HRESULT
InvalidOperationException使用 COR_E_INVALIDOPERATION 值為0x80131509 的 HRESULT。
原文鏈接:https://blog.csdn.net/weixin_44256803/article/details/106056663
相關推薦
- 2022-06-09 ASP.NET?Core中的通用主機HostBuilder_基礎應用
- 2022-10-29 Pytorch訓練模型時如何釋放GPU顯存 torch.cuda.empty_cache()內存釋放
- 2022-07-26 Python標準庫之日期、時間和日歷模塊_python
- 2023-03-26 CSS填充和寬高詳解_基礎教程
- 2022-04-12 Taro打包Android?apk過程詳解_Android
- 2022-09-10 Python實現自定義異常堆棧信息的示例代碼_python
- 2022-07-02 C語言細致講解線程同步的集中方式_C 語言
- 2023-06-20 React?DOM-diff?節點源碼解析_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支