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