2011-07-27 57 views
4

使用C函數,可以通過_eof(pipeOut)來檢查管道的輸出端是否爲空,並跳過讀取操作。在NamedPipeClientStream中檢查EOF

int endOfFile = _eof(myPipeIn); 
if(endOfFile != 0) 
    int aReadCount = _read(myPipeIn, aBufferPtr, 256); 

是否有可能使用.Net的NamedPipeClientStream做類似的事情?

回答

4

不幸的是,Bueller的提示對我無效,因爲ReadLine可以阻止。

但隨着扎克對Alternative to StreamReader.Peek and Thread.Interrupt答案,我想出了以下內容:

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool PeekNamedPipe(SafeHandle handle, 
    byte[] buffer, uint nBufferSize, ref uint bytesRead, 
    ref uint bytesAvail, ref uint BytesLeftThisMessage); 

static bool SomethingToRead(SafeHandle streamHandle) 
{ 
    byte[] aPeekBuffer = new byte[1]; 
    uint aPeekedBytes = 0; 
    uint aAvailBytes = 0; 
    uint aLeftBytes = 0; 

    bool aPeekedSuccess = PeekNamedPipe(
     streamHandle, 
     aPeekBuffer, 1, 
     ref aPeekedBytes, ref aAvailBytes, ref aLeftBytes); 

    if (aPeekedSuccess && aPeekBuffer[0] != 0) 
     return true; 
    else 
     return false; 
} 

在我的情況下,額外的P/Invoke調用是沒有問題的。

+0

您是否使用CreateFile或CreateNamedPipe獲得SafeHandle streamHandle? –

1

根據文檔http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream.aspx,在.Net管道上沒有「peek」類型的功能。

確定的方法是測試NULL操作的讀操作結果。

using (StreamReader sr = new StreamReader(pipeClient)) 
      { 
       // Display the read text to the console 
       string temp; 
       while ((temp = sr.ReadLine()) != null) 
       { 
        Console.WriteLine("Received from server: {0}", temp); 
       } 
      } 
+0

謝謝你的幫助!我將嘗試更改我的代碼,以便與StreamReader解決方案一起使用。 –