C# 使用C在两个线程之间来回传递数据的推荐方法是什么#

C# 使用C在两个线程之间来回传递数据的推荐方法是什么#,c#,C#,我正在尝试制作一个应用程序,该应用程序将使用套接字在两台服务器Connection1和Conenction2之间传递数据。我要做的是从Connection1接收数据并将其传递给Connection2,反之亦然。Connection1和Conenction2位于不同的线程上。在不同线程上调用方法以便在它们之间来回传递数据的最佳方式是什么。两个线程将使用相同的消息对象类型在它们之间双向通信 谢谢您应该使用不可变的数据传输对象 只要一个简单的对象是高度不可变的(这意味着它和它的任何属性都不能改变),在

我正在尝试制作一个应用程序,该应用程序将使用套接字在两台服务器Connection1和Conenction2之间传递数据。我要做的是从Connection1接收数据并将其传递给Connection2,反之亦然。Connection1和Conenction2位于不同的线程上。在不同线程上调用方法以便在它们之间来回传递数据的最佳方式是什么。两个线程将使用相同的消息对象类型在它们之间双向通信


谢谢

您应该使用不可变的数据传输对象

只要一个简单的对象是高度不可变的(这意味着它和它的任何属性都不能改变),在多个线程上使用它就没有错


要在线程之间传递实例,可能需要使用。(这取决于您的设计)

我将使用.NET 3.5上的WCF来完成此任务,它将更具可扩展性。我在我的很多作品中都使用了WCF,而且它完美无缺。它的好处是,您可以在任何平台上共享数据


这取决于这些线程正在执行的操作。虽然在线程之间传递数据相对简单,但唤醒线程来处理数据可能会更加棘手。当您使用每线程/连接模式设计通信时,您的线程几乎总是停留在读取方法中,如。在这种状态下,其他线程实际上无法唤醒这个线程,让他发送他们想要发送的数据。一种解决方案是让接收每秒超时一次,然后检查它是否有数据要传输,但这很糟糕

另一个想法是每个套接字有2个线程,一个线程发送一个线程接收。但是,每个套接字拥有一个线程的所有优势都消失了:在线程代码中不再能够对“会话”进行简单的状态管理,两个线程之间共享一个状态,这简直是一团糟

可以考虑使用异步接收:套接字线程发布A,然后在事件上等待。事件由接收完成或发送队列发出信号,发送队列中有“丢弃”的内容(或者您可以等待多个事件,基本上是一样的)。现在这可以工作了,但现在您有了一个混血儿,部分异步部分,每个套接字一个线程。如果你沿着这条路走,我会走整整9码:让服务器完全异步

完全异步将是最好的解决方案。完成例程对锁定的数据进行操作,而不是在线程之间交换数据。连接1 BeginReceive在接收数据时完成,您解析接收到的数据并分析内容,然后决定通过连接2发送。因此,在Connection2的套接字上调用BeginSend,这意味着接收数据的线程也会发送数据。这比每套接字线程模型更有效,但最大的缺点是,如果您不熟悉异步和多线程编程,这就太复杂了


有关入门知识,请参阅和。

您所描述的异步消息传递。Microsoft已经为此编写了一个名为

的应用程序。如果.NET 4是一个选项,我强烈建议您查看一下,甚至可能用一个符合您需要的If来包装它