簡體   English   中英

NamedPipeClientStream.Connect()拋出System.IO.FileNotFoundException:無法找到指定的文件

[英]NamedPipeClientStream.Connect() throws System.IO.FileNotFoundException: Unable to find the specified file

任何人都可以告訴我為什么NamedPipeClientStream.Connect()會拋出System.IO.FileNotFoundException異常(無法找到指定的文件)? 我認為Connect()方法將永遠阻止而不是拋出異常。

先感謝您!

NamedPipeClientStream.Connect()只是WaitNamedPipeCreateFile內核方法的托管包裝器。

更多信息: https//msdn.microsoft.com/en-us/library/windows/desktop/aa365800( v = vs。85) 。aspx https://msdn.microsoft.com/en-us/library/windows /desktop/aa363858(v=vs.85).aspx

托管部分看起來像(簡化):

public void Connect(int timeout = -1) {
  int tickCount = Environment.TickCount;
  int elapsed = 0;
  SafePipeHandle safePipeHandle;
  while (true) {
    if (!WaitNamedPipe(normalizedPipePath, timeout - elapsed)) {
      int lastWin32Error = Marshal.GetLastWin32Error();
      if (lastWin32Error != FILE_NOT_FOUND && lastWin32Error != SUCCESS) {
        ThrowWinIOError(lastWin32Error, string.Empty);
      }
    }
    if (timeout != -1 && (elapsed = Environment.TickCount - tickCount) >= timeout) {
      throw new TimeoutException();
    }

    safePipeHandle = CreateFile(normalizedPipePath, m_access, FileShare.None, null, FileMode.Open, num, null);
    if (!safePipeHandle.IsInvalid) {
      // success
      return;
    }
    int lastWin32Error2 = Marshal.GetLastWin32Error();
    if (lastWin32Error2 == PIPE_BUSY) {
      continue;
    }
    ThrowWinIOError(lastWin32Error2, string.Empty);
  }
}

所以它調用WaitNamedPipe ,如果管道不存在則會立即返回,並且托管代碼會重試(如果沒有指定超時,它將無條件地重試)。 棘手的部分是CreateFile沒有處理FILE_NOT_FOUND錯誤(它只處理PIPE_BUSY錯誤) - 我懷疑這是你可以遇到種族狀況的地方。

IE: WaitNamedPipe返回ok,但是在CreateFile被點擊之前管道發生了變化(休眠后又回到了無效狀態?)並且CreateFile會拋出你看到的異常。

解決方法應該相對簡單 - 將Connect方法包裝在FILE_NOT_FOUND IOException上重試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM