2010-03-01 74 views
5

我環顧了整個網絡,但我找不到以下問題的答案。取消NamedPipeClientStream.Read致電

我在客戶端程序中有一個C#/ .NET NamedPipeClientStream實例,並且工作線程正在調用NamedPipeClientStream.Read(byte [],int,int)從服務器獲取數據。服務器將數據更新發送到客戶端。

閱讀是阻止呼叫。如果我想關閉客戶端,有沒有辦法取消/退出閱讀呼叫?我已經嘗試在命名管道實例上調用Close,但它對調用Read的線程沒有影響。

我認爲會有一種方法來取消讀取呼叫。如果不是這樣,那看起來這是一個設計非常糟糕的API,因爲你的程序受制於管道。

任何信息非常感謝。

克里斯

回答

7

使用帶有PipeOptions參數的NamedPipeClientStream構造函數。指定PipeOptions.Asynchronous將在調用Close()方法時完成Read()調用。 Read()方法返回0.

+0

:D你是我的英雄!將管道設置爲異步會導致在調用Close時阻止對Read的返回以返回。非常感謝! – Chris 2010-03-01 21:01:14

0

不是直接回答你的問題,但是 - 我不得不做一些NamedPipe IPC相當最近,我發現WCF是真棒。花了我不到一個小時的時間來實現一個POC,是的,我敢肯定它揭示了取消你的請求的方法 - 而且你不必考慮字節數組。

這是您的選擇嗎?

+1

我對WCF進行了一點研究,並對它感到非常興奮,但不幸的是,我正在開發的客戶端必須使用自己的自定義服務器(C++,而不是.NET)預定義的命名管道和通信協議。 當我在看WCF時,我很快被文檔的廣泛性所震撼。我無法快速確定是否可以使用WCF通過使用具有自定義協議的命名管道與現有系統通信。如果有人知道這是否可行,並可以指出我正確的方向,我將不勝感激。 – Chris 2010-03-01 20:18:06