1

我在 NetworkStream.BeginRead() 和 WinForms 类之间从一个线程到另一个线程进行通信时遇到了一些严重的麻烦(当谈到线程和异步调用等主题时,我是一个真正的新手)。

特别是,我通过网络套接字连接到远程客户端,只是监听事件。当我收到一个时,我可以使用 NetworkStream 的 BeginRead() 和 EndRead() 方法正确地将它收集到一个字符串中,没有问题。然后我打算打开一个新表单(在表单的构造函数中使用字符串作为参数),以便可以向用户显示信息。实际上,网络事件将触发用户打开一个表单,以及信息但是,我经常遇到 CrossThreadMessagingExceptions,而且我对代理不够熟悉,我确信我做对了。有人能指出我正确的方向吗?

4

1 回答 1

1

规则是:“您只能访问他们创建的线程上的控件”

您的异步回调将在不同的线程上返回,因此如果您想在表单之间进行通信,则需要编组回 UI 线程。

假设您的NetworkStream代码已经在表单中,您只需要使用 Invoke 或 BeginInvoke。例如:

private void MyAsyncCallback(IAsyncResult ar)
{
    var yourString = ...from your socket...;
    this.Invoke(new MethodInvoker(() => new Form(yourString)));
}
于 2012-03-01T05:00:11.433 回答