日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析...

發布時間:2023/12/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?最近,在做一個使用線程控制下載文件的小程序(使用進度條控件顯示下載進度)時,遇到這樣的問題,

錯誤顯示:

未處理的“System.InvalidOperationException”類型的異常出現在 System.Windows.Forms.dll 中。

其他信息: 線程間操作無效: 從不是創建控件“progressBar1”的線程訪問它。

以前很少做關于線程的程序,而且對于線程的理解也不是很深,無奈只好百度之。很快從網上找到了解決方案:

方法1、在Form?Load事件中加入

?
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
這是是最簡單的方式!

?

方法二、使用Invoke調用委托

參考示例代碼:


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.定義方法,驅動消息

?public?void?MyEvent()
????????{
????????????
for?(int?i?=?0;?i?<?100;?i++)
????????????{
????????????????Thread.Sleep(
100);
????????????????
this.BeginInvoke(mydelegate,?new?object[]?{i});
????????????
????????????}
????????}



4: 運行
??private?void?button1_Click(object?sender,?EventArgs?e)
????????{
????????????mydelegate?
=?new?myDelegate(ShowMessage);
????????????Thread?myThread?
=?new?Thread(MyEvent);

????????????
//IsBackground?是否后臺
????????????
//這個屬性很重要?.如果?Thread?IsBackground?等于false
????????????
//?當線程還沒有結束時,你點了關閉按鈕
????????????
//?將拋出An?unhandled?exception
????????????
//of?type?'System.InvalidOperationException'
????????????
//occurred?in?System.Windows.Forms.dll?異常
????????????myThread.IsBackground?=?true;
????????????myThread.Start();
????????}

?

問題分析:

根據錯誤提示,可知在調試器中運行應用程序時,如果不是控件的創建者線程試圖調用該控件時,則調試器會引發 InvalidOperationException,并提示消息:“從不是創建控件 Control Name 的線程訪問它。”?說白了,就是資源訪問的不一致性,控件的調用者線程不是控件的創建者線程,這是.net實現資源安全訪問機制的必然結果。訪問 Windows 窗體控件本質上不是線程安全的。如果多個線程同時操作某一控件的狀態,則可能會迫使該控件進入一種不一致的狀態。

轉載于:https://blog.51cto.com/5902977/1055986

總結

以上是生活随笔為你收集整理的线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。