VB.NET DLL中的Threadsafe返回属性

时间:2016-01-05 08:57:21

标签: vb.net multithreading dll thread-safety

我尝试创建一个使用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(对于我的罪)。我承认我没有足够的经验或对多线程和线程安全的理解,知道我有什么选择(如果有的话)。

0 个答案:

没有答案