2013-03-12 131 views
0

我想在一個線程上發送請求並在另一個線程上收集響應。這將如何工作,我無法匹配請求與響應權限?假設我無法自定義請求/響應。 如果我在一個線程上發送請求,那麼甚至可以與接收線程/結束一起工作?所收到的東西是不是混淆了,因爲我仍然在收到第一個請求的同時繼續向同一個套接字發送東西?發送和接收通過相同的套接字,但在不同的線程?

+0

不是基於套接字通信事件嗎?你爲什麼需要線程? – 2013-03-12 12:27:12

回答

1

這聽起來像你正在寫一個多路複用器。如果我們假設每個請求在某個時刻都會得到恰好一個響應(假設沒有嚴重錯誤),那麼您需要保留一個隊列,用於發送請求的人,這樣當您收到響應時,您可以匹配響應正確的順序。確保個人請求以原子方式寫入且不中斷是至關重要的;這可以通過鎖定(圍繞寫入)或通過創建一個單獨的等待出站消息隊列來完成。

我這樣做的方式是使用Task API;每個掛起的響應基本上映射到TaskCompletionSource<T>(對於某些T);當您收到回覆時,您可以使用TrySetResult(或錯誤),表示主叫方已完成 - 我們可以使用Wait,ContinueWithawait

0

主要的問題是請求/響應是否由對方異步處理。
如果服務器以相同的順序響應,那麼我會將BlockingCollection作爲Fifo隊列添加爲數據存儲。 (BlockingCollection的默認集合類型是ConcurrentQueue)。
發件人添加到BlockingCollection並且收件人從集合中獲取。

相關問題