最近,在作一個使用線程控制下載文件的小程序(使用進度條控件顯示下載進度)時,遇到這樣的問題,小程序
錯誤顯示:安全
未處理的「System.InvalidOperationException」類型的異常出如今 System.Windows.Forms.dll 中。ide
其餘信息: 線程間操做無效: 從不是建立控件「progressBar1」的線程訪問它。this
之前不多作關於線程的程序,並且對於線程的理解也不是很深,無奈只好百度之。很快從網上找到了解決方案:spa
方法一、在Form Load事件中加入.net
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
這是是最簡單的方式!線程
方法2、使用Invoke調用委託調試
參考示例代碼:orm
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 窗體控件本質上不是線程安全的。若是多個線程同時操做某一控件的狀態,則可能會迫使該控件進入一種不一致的狀態。