2014-03-29 123 views
0

我已經實現了一個服務器/客戶端測試裝置,它使用帶有net.pipe綁定的流式傳輸模式。這是所有類型的工作,但是當實際服務器的流實現阻塞在一個空緩衝區時,我遇到了一個問題。即使我刪除所有同步,併發模式設置爲多我有一個問題,其中我的客戶端應用程序阻止在stream.Read。因此,我的客戶端通過「GetStream」調用(在非UI線程上)啓動與服務器的連接,服務器返回的實際流實現是阻塞流(例如NetStream),因此它會當沒有字節可供讀取時阻止。這導致了服務主機的完全鎖定,所以現在客戶端不能進行任何進一步的調用,直到stream.read操作解除阻塞。WCF命名管道流

有人可以澄清這種行爲嗎?

回答

0

我已經解決了匿名管道的工作代碼,名爲管道異步和同步。根據我的經驗,我可以告訴你,你不能共享內存緩衝區「空」。即使在異步,我相信,創建後臺線程同步讀取和寫入。

所以目前只考慮這一個事實,即,

服務器必須先發送寫緩衝=>客戶端應該看它=>客戶端必須寫回到那個緩衝=> Server必須閱讀。

該週期必須永久重複以防止應用程序凍結。我開始認爲這是通過服務器/客戶端套接字使共享內存通信不同的原因。在共享內存方法中,您可能不必擔心同步,也會將客戶端專用於服務器,使客戶端無法與服務器共存。

0

你應該看看使用舊的'異步'風格開始/結束讀/寫方法,以允許異步通信。不幸的是,在.net中沒有異步/等待支持命名管道 - 但是,您可以使用TaskFactory.FromAsync方法對它們進行封裝。