2013-03-12 94 views
0

我想在一个线程上发送请求并在另一个线程上收集响应。这将如何工作,我无法匹配请求与响应权限?假设我无法自定义请求/响应。 如果我在一个线程上发送请求,那么甚至可以与接收线程/结束一起工作?所收到的东西是不是混淆了,因为我仍然在收到第一个请求的同时继续向同一个套接字发送东西?发送和接收通过相同的套接字,但在不同的线程?

+0

不是基于套接字通信事件吗?你为什么需要线程? – 2013-03-12 12:27:12

回答

1

这听起来像你正在写一个多路复用器。如果我们假设每个请求在某个时刻都会得到恰好一个响应(假设没有严重错误),那么您需要保留一个队列,用于发送请求的人,这样当您收到响应时,您可以匹配响应正确的顺序。确保个人请求以原子方式写入且不中断是至关重要的;这可以通过锁定(围绕写入)或通过创建一个单独的等待出站消息队列来完成。

我这样做的方式是使用Task API;每个挂起的响应基本上映射到TaskCompletionSource<T>(对于某些T);当您收到回复时,您可以使用TrySetResult(或错误),表示主叫方已完成 - 我们可以使用Wait,ContinueWithawait

0

主要的问题是请求/响应是否由对方异步处理。
如果服务器以相同的顺序响应,那么我会将BlockingCollection作为Fifo队列添加为数据存储。 (BlockingCollection的默认集合类型是ConcurrentQueue)。
发件人添加到BlockingCollection并且收件人从集合中获取。

相关问题