我有一个在System.Net.Sockets.NetworkStream.BeginRead完成时被异步调用的方法。

 skDelegate = New AsyncCallback(AddressOf skDataReceived)
 skStream.BeginRead(skBuffer, 0, 100000, skDelegate, New Object)


在该回调方法中,我需要与UI线程进行交互。

Sub skDataReceived(ByVal result As IAsyncResult)
    CType(My.Application.OpenForms.Item("frmMain"), frmMain).refreshStats(d1, d2)
End Sub


方法完成后,这将导致异常。 (执行End Sub时)


  撤消操作遇到了
  与什么不同的上下文
  应用于相应的集合
  操作。可能的原因是
  在线程上设置了上下文,并且
  未还原(撤消)。


那么如何通过回调方法与UI线程进行交互?我究竟做错了什么?

最佳答案

您必须在frmMain对象上使用Invoke或BeginInvoke来使消息(委托)排队以在UI线程上执行。

这就是我在C#中的处理方式。

frmMain.Invoke(()=> frmMain.refreshStats(d1,d2));


还要检查此list of Invoke types and their uses

08-26 18:21