c# 線程間操作無效: 從不是建立控制項“”的線程訪問它,用託管來解決

來源:互聯網
上載者:User

如果代碼是在VS2003中的話應該不會拋出這個異常,只有在使用VS2005的時候,如果你從非建立這個控制項的線程中訪問這個控制項或者操作這個控制項的話就會拋出這個異常。這是微軟為了保證安全執行緒以及提高代碼的效率所做的改進.

以前在VS2003中,我們通常都會忽略這種問題的存在,無限制的使用線程來完成一些工作,但是當系統慢慢變大的時候,這種濫用的線程不但沒有提高我們的效率,反而使我們找錯誤的效率以及系統的複雜度大大的增加了。

微軟的這一改動可以讓我們在使用線程的時候,充分考慮一下線程的安全以及線程的使用規範,這樣會有益於我們做出健壯的程式。

堅決這種跨線程的問題在VS2005中提供了兩種簡單的方法(我個人當前所瞭解的只有這兩種):
一種是通過設定System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;(winform下)如果在你的程式初始化的時候設定了這個屬性,而且在你的控制項中使用的都是微軟Framework類庫中的控制項的話,系統就不會再拋出你上面所說的這個錯誤了。當然這隻是為了將VS2003的代碼轉換到VS2005下所使用的一種常見的方法。不建議採用。

第二種方法就是微軟建議採用的跨線程調用的一種通用方法,就是使用代理來實現,就是將你所要操作的代碼放到一個代理種,然後將這個代理交給建立這個控制項的線程來執行你的代碼。例如:

 

private void Form1_Load(object sender, EventArgs e) {     //建立線程需要System.Threading命名空間     Thread t1, t2; // 說明為表單類成員     t1 = new Thread(new ThreadStart(BackgroundProcess));     t1.Start(); //啟動線程t1 } /// <summary> /// 定義一個代理 /// </summary> private delegate void dd(); //處理方法private void BackgroundProcess() {     // 將代理執行個體化為一個匿名代理     dd = delegate()     {         int i = 1;         while (true)         {             // 向列表框增加一個項目             listBox1.Items.Add("Iterations: " + i.ToString());             i++;             Thread.Sleep(2000); // 指定線程休眠的時間         }     };     listBox1.Invoke(dd); }

 

 

 

 

上面這個代碼只是在你的代碼中聲明了一個代理,並且用VS2005中新加的文法(匿名代理,又名匿名方法。)來執行個體話這個代理,將你線上程中要操作的代碼都放到這個匿名的方法中去。然後通過使用控制項的Invoke方法(也可以使用控制項的BeginInvoke方法——Invoke方法是同步的BeginInvoke方法是非同步)來調用這個代理。當然在Invoke方法中你也可以輸入任何形式的代理。通過這種方式調用的代碼就不會拋出你出現的那個異常了。

上面這種代理的方式類似於C++中的回呼函數,你寫出了執行的方法,然後通知某個線程由那個線程來調用你的這個方法,這樣就做到了在固定的線程裡執行修改線程內部組件的方式。這樣就完全達到安全執行緒了。

另外,如果你使用的不是.NET類庫中的控制項的話,最好不要使用第一種方式,因為某些第三方控制項線上程安全性方面做的不是太好,可能還會拋出一些不可預料的異常。例如DevExpress控制項陳列庫一般會拋出對象引用為空白的異常。所以建議所有在VS2005種使用線程操作控制項的時候都利用第二種方法來實現,如果嫌麻煩,也可以將這些控制項利用繼承的方式在父類裡面實現這些代理方式的修改

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.