gpt4 book ai didi

c# - NamedPipeClientStream.Connect() 抛出 System.IO.FileNotFoundException : Unable to find the specified file

转载 作者:行者123 更新时间:2023-11-30 18:29:11 37 4
gpt4 key购买 nike

谁能告诉我为什么 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 错误)——我怀疑这是你可能会遇到种族问题的地方。

I.E.:WaitNamedPipe 返回正常,但在 CreateFile 被命中之前,管道已更改(休眠后返回 void ?)并且 CreateFile 抛出您看到的异常。

解决方法应该相对简单 - 包装 Connect 方法以在 FILE_NOT_FOUND IOException 上重试。

关于c# - NamedPipeClientStream.Connect() 抛出 System.IO.FileNotFoundException : Unable to find the specified file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23432640/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com