我正在尝试创建一个应用程序,它将使用套接字在两个服务器Connection1和Conenction2之间传递数据。我想要做的是从Connection1接收数据并将其传递给Connection2,反之亦然.Connection1和Conenction2在不同线程。在不同线程上调用方法以便在它们之间来回传递数据的最佳方法是什么。两个线程将使用相同的消息对象类型在它们之间的两个方向上进行通信。
由于
答案 0 :(得分:8)
您应该使用不可变数据传输对象。
只要一个简单的对象是非常不可变的(意味着它或它的任何属性都不能改变),在多个线程上使用它没有任何问题。
要在线程之间传递实例,您可能希望使用pseudo-mutable thread-safe stack。 (这取决于你的设计)
答案 1 :(得分:2)
如果选择.NET 4,我强烈建议您查看ConcurrentQueue<T>
,如果符合您的需要,甚至可以用BlockingCollection<T>
包装它。
答案 2 :(得分:1)
这取决于这些线程正在做什么。虽然在线程之间传递数据相对简单,但唤醒线程来处理数据可能会更棘手。当您使用线程/连接范例设计通信时,您的线程几乎一直停留在Read方法中,例如Socket.Receive。在这种状态下,其他线程实际上无法唤醒此线程,让他发送他们想要发送的数据。一种解决方案是每秒钟接收一次,并检查是否有数据要传输,但这很简单。
另一个想法是每个插槽有2个线程,一个用于发送一个接收。但是,每个套接字拥有一个线程的所有优点都消失了:你不再能够在线程代码中对'session'进行简单的状态管理,你在两个线程之间共享一个状态,这只是一团糟。 / p>
您可以考虑使用异步接收:套接字线程发布BeginReceive然后等待事件。事件由接收完成或通过发送队列发出“丢弃”信号(或者您可以等待多个事件,基本相同)。现在这可以工作,但此时你有一个混血儿,部分异步部分one-thread -per-socket。如果沿着这条路走下去,我会走9码:让服务器完全异步。
完全异步将是最好的解决方案。而不是在线程之间交换数据,完成例程对锁定的数据进行操作。 Connection1 BeginReceive在接收数据时完成,您解析收到的数据并分析内容,然后决定在Connection2上发送它。因此,您在Connection2的套接字上调用BeginSend,这意味着接收数据的线程也会发送数据。这比使用每个插槽的线程模型更有效且更好,但最大的缺点是,如果你熟悉异步和多线程编程,那就简单了。
有关入门知识,请参阅Asynchronous Server Socket Example和Asynchronous Client Socket Example。
答案 3 :(得分:0)
您所描述的异步消息传递。 Microsoft已经为此编写了一个名为MSMQ
的应用程序答案 4 :(得分:-2)
我会在.NET 3.5上使用WCF来完成此任务,它将更具可扩展性。我正在为我的很多作品使用WCF而且它完美无缺。关于它的好处是你可以在任何平台上共享你的数据。