2010-03-08 16 views
2

我想做一个应用程序,将通过两个服务器之间的数据使用套接字Connection1和Conenction2。我想要做的是从Connection1接收数据并将它传递给Connection2,反之亦然.Connection1和Conenction2在不同的线程上。在不同的线程上调用方法以在它们之间来回传递数据的最佳方式是什么?两个线程将使用相同的消息对象类型在它们之间的两个方向上进行通信。什么是推荐的方式来使用C#在两个线程之间来回传递数据

谢谢

回答

8

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

只要一个简单的对象是非常不可变的(意味着它既不是它的属性也不是它的任何属性都可以改变),在多线程中使用它没有任何问题。

要在线程之间传递实例,您可能需要使用pseudo-mutable thread-safe stack。 (这取决于你的设计)

1

那要看是什么这些线程在做什么。虽然在线程间传递数据是相当直接的,但唤醒线程来处理数据可能会更棘手。当您使用线程/连接范例设计通信时,线程几乎全部停留在Read方法中,例如Socket.Receive。在这种状态下,其他线程无法实际唤醒此线程,让他发送想要发送的数据。一种解决方案是每秒都有接收超时并检查是否有数据要传输,但这只是简单的问题。

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

您可以考虑使用异步接收,而不是:插座螺纹职位BeginReceive然后等待事件。接收完成通过发送队列发送事件(或者您可以等待多个事件,基本上是同样的事情)来发信号通知事件。现在,这将工作,但在这一刻,你有一个混血儿,部分异步部分单线程每插座。如果沿着这条道路走下去,我会走完整个9码:让服务器完全异步。

完全异步将是最好的解决方案。完成例程不是在线程之间交换数据,而是在锁定的数据上运行。在连接1 BeginReceive完成,当它接收数据时,您解析接收到的数据和分析的内容,然后再决定送它连接2。因此,您在Connection2的套接字上调用BeginSend,这意味着接收数据的线程也会发送数据。这是更有效的ANS鳞比线程每个插座模型较好,但最大的缺点是,如果你MOT熟悉异步和多线程编程这只是普通的复杂。

参见Asynchronous Server Socket ExampleAsynchronous Client Socket Example的引物。

0

你所描述的异步消息传递什么。微软已经写了这样的一个应用程序称为MSMQ

相关问题