溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#編程報(bào)錯(cuò)System.InvalidOperationException怎么解決

發(fā)布時(shí)間:2022-05-20 14:28:11 來源:億速云 閱讀:3691 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“C#編程報(bào)錯(cuò)System.InvalidOperationException怎么解決”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C#編程報(bào)錯(cuò)System.InvalidOperationException怎么解決”吧!

C#報(bào)錯(cuò)System.InvalidOperationException

問題場(chǎng)景

在C# Windows GUI編程中,從某個(gè)子線程去訪問設(shè)計(jì)器中的某個(gè)控件,例如將某個(gè)按鈕禁用。這樣就會(huì)觸發(fā)該異常:

System.InvalidOperationException:"線程間操作無(wú)效: 從不是創(chuàng)建控件"btn_exp"的線程訪問它。"

問題原因

在C# Windows GUI編程中有一個(gè)規(guī)則,就是只能通過創(chuàng)建控件的線程來訪問控件,否則就可能產(chǎn)生不可預(yù)料的結(jié)果。

解決方案

方案一,打破規(guī)則

在構(gòu)造函數(shù)中加入以下語(yǔ)句:

Control.CheckForIllegalCrossThreadCalls = false;

將以上屬性設(shè)置為假則會(huì)取消對(duì)非法跨線程調(diào)用進(jìn)行檢查,簡(jiǎn)單粗暴但不保證不出錯(cuò)。

方案二,利用委托(Delegate)

.net為我們提供了Invoke 方法與BeginInvoke方法去調(diào)用委托,它們的區(qū)別在于前者是線程阻塞的,后者是異步的。

因此當(dāng)委托是一個(gè)較為耗時(shí)的函數(shù)時(shí),Invoke 方法就會(huì)導(dǎo)致線程阻塞,表現(xiàn)為用戶界面卡頓;而BeginInvoke方法則不會(huì)等待委托執(zhí)行完畢。

雖然BeginInvoke方法不會(huì)導(dǎo)致線程阻塞,但可以使用EndInvoke方法或者其它類似WaitHandle機(jī)制等待異步操作的完成。

BeginInvoke(new MethodInvoker(()=>
{
    btn_exp.Enabled = false;
}));

其中,MethodInvoker委托 與EventHandler 委托的區(qū)別在于前者是不帶參數(shù)的:

public delegate void MethodInvoker();
public delegate void EventHandler(object sender, EventArgs e);

c# WPF InvalidOperationException異常的幾種常見原因

什么是InvalidOperationException

操作無(wú)效異常。當(dāng)方法調(diào)用對(duì)對(duì)象的當(dāng)前狀態(tài)無(wú)效時(shí)引發(fā)的異常。

繼承

  • Object

  • Exception

  • SystemException

詳細(xì)說明

如果調(diào)用方法失敗是由無(wú)效參數(shù)以外的其他原因?qū)е碌?則使用該異常。通常, 當(dāng)對(duì)象的狀態(tài)不支持方法調(diào)用時(shí), 將引發(fā)此異常。

例如, 以下方法或原因會(huì)引發(fā)異常nvalidOperationException:

  • IEnumerator.MoveNext如果在創(chuàng)建枚舉器后修改集合的對(duì)象,。

  • ResourceSet.GetString如果在執(zhí)行方法調(diào)用前關(guān)閉資源集,。

  • XContainer.Add如果要添加的對(duì)象將導(dǎo)致結(jié)構(gòu)不正確的 XML 文檔,。

  • 嘗試從非主線程或 UI 線程的線程操作 UI 的方法。

  • 從非 UI 線程更新 UI 線程(跨UI線程調(diào)用,樓主就是因?yàn)檫@個(gè)原因,在線程里調(diào)用的UI控件導(dǎo)致報(bào)錯(cuò)!)

  • 在循環(huán)訪問集合時(shí)更改集合

  • 對(duì)其對(duì)象無(wú)法進(jìn)行比較的數(shù)組或集合進(jìn)行排序

  • 將為 null <T>轉(zhuǎn)換為其基礎(chǔ)類型

  • 對(duì)空集合調(diào)用 system.exception 方法

  • 對(duì)沒有一個(gè)元素的序列調(diào)用 SingleOrDefault 或可枚舉的。

  • 動(dòng)態(tài)跨應(yīng)用程序域字段訪問

由于InvalidOperationException異常可以在多種情況下引發(fā),因此讀取由message屬性返回的異常消息非常重要。

HRESULT

InvalidOperationException使用 COR_E_INVALIDOPERATION 值為0x80131509 的 HRESULT。

感謝各位的閱讀,以上就是“C#編程報(bào)錯(cuò)System.InvalidOperationException怎么解決”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)C#編程報(bào)錯(cuò)System.InvalidOperationException怎么解決這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI