发送和接收通过相同的套接字,但在不同的线程

本文关键字:套接字 线程 | 更新日期: 2023-09-27 18:03:42

我想在一个线程上发送请求并在另一个线程上收集响应。怎么可能呢,我无法匹配请求和响应,对吧?假设我不能自定义请求/响应。如果我在一个线程上发送请求,如何与接收线程/端一起工作?它接收到的东西不会都混在一起吗?因为我一直在向同一个套接字发送东西,而它仍然在接收第一个请求?

发送和接收通过相同的套接字,但在不同的线程

听起来你在写一个多路复用器。如果我们假设每个请求在某个时刻只得到一个响应(假设没有严重错误),那么您需要为已发送的请求保持一个队列,以便在接收响应时能够以正确的顺序匹配请求的响应。确保单个请求的自动写入和不间断是至关重要的;这可以通过锁定(围绕写入)来实现,或者通过创建一个单独的挂起出站消息队列来实现。

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

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