我想在一个线程上发送请求并在另一个线程上收集响应。那将如何工作,我无法将请求与响应相匹配,对吗?假设我无法自定义请求/响应。如果我在一个线程上发送请求,那将如何与接收线程/端一起工作?它收到的东西不会全部混淆,因为我在它仍在接收第一个请求的同时不断向同一个套接字发送东西吗?
问问题
265 次
2 回答
1
听起来您正在编写多路复用器。如果我们假设每个请求在某个时候都会得到一个响应(假设没有严重错误),那么您需要将已发送的请求保留在队列中,这样当您收到响应时,您可以将响应与请求中的请求相匹配正确的顺序。确保单个请求以原子方式编写且不间断,这一点至关重要;这可以通过锁定(围绕写入)或通过创建一个单独的待处理出站消息队列来完成。
我这样做的方法是使用Task
API;每个待处理的响应基本上都映射到一个TaskCompletionSource<T>
(对于某些T
);当您收到响应时,您可以TrySetResult
(或错误),向调用者指示完成 - 我们可以使用谁Wait
,ContinueWith
或await
。
于 2013-03-12T12:33:14.357 回答
0
主要的悬而未决的问题是请求/响应是否由对方异步处理。
如果服务器以相同的顺序响应,那么我将添加一个 BlockingCollection 作为 Fifo 队列作为数据存储。(BlockingCollection 的默认集合类型是 ConcurrentQueue)。
发送者添加到 BlockingCollection,接收者从集合中获取。
于 2013-03-12T12:42:35.957 回答