UI スレッドで frmMain.refreshStats メソッドを呼び出す必要があります。もちろん、Control.InvokeRequired プロパティと Control.Invoke ( MSDN ドキュメント) を使用してこれを行う方法は多数あります。
「EndAsync」メソッドでメソッド呼び出し UI スレッド セーフにするか、refreshStats メソッドでスレッド セーフをチェックする (Control.InvokeRequired を使用) ことができます。
EndAsync UI のスレッドセーフは次のようになります。
Public Delegate Sub Method(Of T1, T2)(ByVal arg1 As T1, ByVal arg2 As T2)
Sub skDataReceived(ByVal result As IAsyncResult)
Dim frmMain As Form = CType(My.Application.OpenForms.Item("frmMain"), frmMain)
Dim d As Method(Of Object, Object)
'create a generic delegate pointing to the refreshStats method
d = New Method(Of Object, Object)(AddressOf frmMain.refreshStats)
'invoke the delegate under the UI thread
frmMain.Invoke(d, New Object() {d1, d2})
End Sub
または、refreshStats メソッドをチェックして、UI スレッドの下でそれ自体を呼び出す必要があるかどうかを確認できます。
Public Delegate Sub Method(Of T1, T2)(ByVal arg1 As T1, ByVal arg2 As T2)
Sub refreshStats(ByVal d1 As Object, ByVal d2 As Object)
'check to see if current thread is the UI thread
If (Me.InvokeRequired = True) Then
Dim d As Method(Of Object, Object)
'create a delegate pointing to itself
d = New Method(Of Object, Object)(AddressOf Me.refreshStats)
'then invoke itself under the UI thread
Me.Invoke(d, New Object() {d1, d2})
Else
'actual code that requires UI thread safety goes here
End If
End Sub