我尝试创建一个使用Async TCP / IP Client与服务器通信的DLL。一切正常,我可以使用.InvokeRequired将数据返回到Windows窗体文本框,以使返回的数据线程安全。
问题是我需要将数据作为线程安全从DLL返回。代码片段如下。是否有可能使mReturnString中的字符串(以及属性ReturnString)100%线程安全,如果是,如何?
Private mReturnString As String
Public Event DataIsBack()
Public ReadOnly Property ReturnString
Get
SyncLock mReturnString
Static theString
theString = mReturnString
Return theString
End SyncLock
End Get
End Property
Private Sub UpdateStatus(ByVal t As String)
SyncLock t
mReturnString = t
RaiseEvent DataIsBack()
End SyncLock
End Sub
EDIT。这是Windows窗体中的代码。
Private Sub GetReturnedData() Handles newObject.DataIsBack
tBox.Text = newObject.ReturnString & vbCrLf
End Sub
跨线程操作无效:控制TBox'从其创建的线程以外的线程访问。
我可以使用tBox.InvokeRequired来"修复"这个。
Private Sub GetReturnedData(ByVal theString As String) Handles newObject.DataIsBack
If Me.tBox.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf GetReturnedData)
Me.Invoke(d, New Object() {theString})
Else
Me.tBox.Text = Me.tBox.Text & theString
End If
End Sub
问题是我试图让这个工作没有.InvokeRequired部分,因为Excel将使用DLL(对于我的罪)。我承认我没有足够的经验或对多线程和线程安全的理解,知道我有什么选择(如果有的话)。