1. 程式人生 > >執行緒間操作無效: 從不是建立控制元件...的解決辦法

執行緒間操作無效: 從不是建立控制元件...的解決辦法

執行緒間操作無效: 從不是建立控制元件的執行緒訪問它。它在VS2003裡邊不會出現這個問題,在VS2005VS2008版本里就會出這個問題的,主要是為了安全考慮哦,目前我知道的解決方法有兩個

第一:

使用遮蔽執行緒間進行不安全監測的方法。

Control.CheckForIllegalCrossThreadCalls = false;

執行緒開始的時候加這麼一句,OK,看不到錯誤了^_^,啥都能用了……第二:使用委託的方法,在05裡,每個控制元件都有個InvokeRequired的屬性~,判斷一下是不是true,是的話進行Invoke操作的,完事了~

//建立個委託privatedelegate

string returnStrDelegate();

//搞個最簡單滴取值滴方法~ privatestring returnSchool()
        
 {
             
return CB_School.SelectedValue.ToString();
         }

//判斷一下是不是該用Invoke~,不是就直接返回~ privatestring returnCB(returnStrDelegate myDelegate)
        
 {
             
if (this.InvokeRequired)
             
 {
                
 return (string)this.Invoke(myDelegate);
             }
             
else {
                
 return myDelegate();
             }
         }

//別的執行緒裡的呼叫哇~string _school = returnCB(returnSchool);

對使用這兩種方法的點評:第一種方法較為簡單,但是第二種方法最為安全,主要是因為:使用第一種方法只是簡單的將錯誤提示禁用了,仍然存在跨執行緒呼叫控制元件的問題。為此可能造成兩個執行緒同時或者迴圈改變該控制元件的狀態導致執行緒死鎖。第二種使用的

Invoke方法是執行緒同步的方法,所以執行過程是有先後順序的,所以就不會出現那個異常了,使用過程中不會造成執行緒間相互呼叫時造成的死鎖。如果執行緒間出現了相互呼叫,建議使用第二種方法來考慮執行緒間調用出現死鎖的安全問題;如果執行緒間並沒有出現相互呼叫,屬於併發執行緒,則使用第一種方法效率更高。

注意:第二種方法是用委託將方法呼叫的時機進行了排序卻不能達到兩個方法並行執行的效果,安全是安全了卻也把同步功能的效果費掉了,大家在使用時綜合考慮使用哪種方法。