最近我們把vs2003的Windows Form程式升級到vs2005下
在升級的過程式發生一個和執行緒有關的問題
在執行階段,系統丟出一個錯誤訊息
訊息名稱為『進行對 Windows Form 控制項的安全執行緒呼叫』
當您發生這個錯誤時,
您應該在Windows Form的程式中有執行一個Threading的程式
這個執行緒程式會呼叫或call back(raise一個事件)
並將資料回傳給Form的某個控制項。
而.net 2.0中認定您的做法是不安全的執行緒呼叫。
請參考(http://msdn2.microsoft.com/zh-tw/library/ms171728.aspx)
小弟的解決方法如下:
' 建立一個Delegate事件來處理安全姓的非同步呼叫
Delegate Sub GetMsgCallback(ByVal msg As String)
' 以下這個方法就是您被呼叫的method
Public Sub GetMsg(ByVal msg As String)
' TextBox1就是您用來取得資料或指定資料的控制項
If Me.TextBox1.InvokeRequired Then
Dim d As New GetMsg(AddressOf GetMsgCallback)
Me.Invoke(d, New Object() {value})
Else
Me.TextBox1.Text= "應該就沒問題了"
End If
End Sub
在升級的過程式發生一個和執行緒有關的問題
在執行階段,系統丟出一個錯誤訊息
訊息名稱為『進行對 Windows Form 控制項的安全執行緒呼叫』
當您發生這個錯誤時,
您應該在Windows Form的程式中有執行一個Threading的程式
這個執行緒程式會呼叫或call back(raise一個事件)
並將資料回傳給Form的某個控制項。
而.net 2.0中認定您的做法是不安全的執行緒呼叫。
請參考(http://msdn2.microsoft.com/zh-tw/library/ms171728.aspx)
小弟的解決方法如下:
' 建立一個Delegate事件來處理安全姓的非同步呼叫
Delegate Sub GetMsgCallback(ByVal msg As String)
' 以下這個方法就是您被呼叫的method
Public Sub GetMsg(ByVal msg As String)
' TextBox1就是您用來取得資料或指定資料的控制項
If Me.TextBox1.InvokeRequired Then
Dim d As New GetMsg(AddressOf GetMsgCallback)
Me.Invoke(d, New Object() {value})
Else
Me.TextBox1.Text= "應該就沒問題了"
End If
End Sub
文章標籤
全站熱搜

我也曾經遇過這類問題, 原因是我安裝一些只適用於VS2003的外掛軟體, 如Data Dynamics ActiveReports 和 ComponentOne系列, 由於Windows Form本身就無法開啟, 所以無法修改, 最簡單的方法就是把這個Form砍掉再重建一個, (重建之前要先安裝適用VS2005的軟體) 不過要記得把舊的備份。 我想請吳老師.....打電話給小比爾:不要沒事就一直升級他們家的軟 體,會改不完的!
比爾先生永遠嫌錢賺不夠 一直都有升級的軟體… 永遠升級不完