线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析...
?最近,在做一個(gè)使用線程控制下載文件的小程序(使用進(jìn)度條控件顯示下載進(jìn)度)時(shí),遇到這樣的問題,
錯(cuò)誤顯示:
未處理的“System.InvalidOperationException”類型的異常出現(xiàn)在 System.Windows.Forms.dll 中。
其他信息: 線程間操作無效: 從不是創(chuàng)建控件“progressBar1”的線程訪問它。
以前很少做關(guān)于線程的程序,而且對于線程的理解也不是很深,無奈只好百度之。很快從網(wǎng)上找到了解決方案:
方法1、在Form?Load事件中加入
?
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
這是是最簡單的方式!
?
方法二、使用Invoke調(diào)用委托
參考示例代碼:
1.定義 委托
???delegate?void?myDelegate(int?i);
???myDelegate?mydelegate?=?null;
2.定義方法,顯示消息
?public?void?ShowMessage(int?i)
????????{
????????????this.textBox1.Text?=?i.ToString();
????????????this.progressBar1.Value?=?i;
????????}
3.定義方法,驅(qū)動(dòng)消息
?public?void?MyEvent()
????????{
????????????for?(int?i?=?0;?i?<?100;?i++)
????????????{
????????????????Thread.Sleep(100);
????????????????this.BeginInvoke(mydelegate,?new?object[]?{i});
????????????
????????????}
????????}
4: 運(yùn)行
??private?void?button1_Click(object?sender,?EventArgs?e)
????????{
????????????mydelegate?=?new?myDelegate(ShowMessage);
????????????Thread?myThread?=?new?Thread(MyEvent);
????????????//IsBackground?是否后臺(tái)
????????????//這個(gè)屬性很重要?.如果?Thread?IsBackground?等于false
????????????//?當(dāng)線程還沒有結(jié)束時(shí),你點(diǎn)了關(guān)閉按鈕
????????????//?將拋出An?unhandled?exception
????????????//of?type?'System.InvalidOperationException'
????????????//occurred?in?System.Windows.Forms.dll?異常
????????????myThread.IsBackground?=?true;
????????????myThread.Start();
????????}
?
問題分析:
根據(jù)錯(cuò)誤提示,可知在調(diào)試器中運(yùn)行應(yīng)用程序時(shí),如果不是控件的創(chuàng)建者線程試圖調(diào)用該控件時(shí),則調(diào)試器會(huì)引發(fā) InvalidOperationException,并提示消息:“從不是創(chuàng)建控件 Control Name 的線程訪問它。”?說白了,就是資源訪問的不一致性,控件的調(diào)用者線程不是控件的創(chuàng)建者線程,這是.net實(shí)現(xiàn)資源安全訪問機(jī)制的必然結(jié)果。訪問 Windows 窗體控件本質(zhì)上不是線程安全的。如果多個(gè)線程同時(shí)操作某一控件的狀態(tài),則可能會(huì)迫使該控件進(jìn)入一種不一致的狀態(tài)。
轉(zhuǎn)載于:https://blog.51cto.com/5902977/1055986
總結(jié)
以上是生活随笔為你收集整理的线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第七章 数组
- 下一篇: 汇编调用c函数为什么要设置栈