gpt4 book ai didi

c# - 如何取消 PIPE 操作?

转载 作者:可可西里 更新时间:2023-11-01 10:34:48 26 4
gpt4 key购买 nike

我有一个 C++ 和 C# 应用程序,我在其中使用命名管道向彼此发送命令。它运行良好,直到我注意到我无法取消 Read()调用,我正在使用一个停止变量但没有注意到这不是我所需要的,因为它无法读取停止变量状态直到离开 Read()称呼。我发现我会使用 PIPE_NOWAIT CreateNamedPipe() 中的属性称呼。当我添加它时,C# 抛出 System.NullReferenceException因为 FileStream 为 null,所以它是从 new FileStream(clientHandle, FileAccess.ReadWrite, BUFFER_SIZE, true); 创建的,其中 clientHandle 创建如下:

   private void Listen()
{
while (!exitLoop)
{
clientHandle = CreateNamedPipe(this.pipeName,
DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_NOWAIT,
255,
BUFFER_SIZE,
BUFFER_SIZE,
0,
IntPtr.Zero);

if (clientHandle.IsInvalid)
{
return;
}

int ok = ConnectNamedPipe(clientHandle, IntPtr.Zero);

//could not connect client
if (ok == 0) // here's the error, getLastError() = ERROR_PIPE_LISTENING
{
return;
}
stream = new FileStream(clientHandle, FileAccess.ReadWrite, BUFFER_SIZE, true);
// ....
}

如果重要的话,在 C++ 中管道是这样创建的:

 hPipe1 = CreateFile(lpszPipename1,
GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if (!IsValidPipe(hPipe1))
{
openError();
return;
}

hPipe2 = CreateFile(lpszPipename2,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);

所以我的问题是:错误是ERROR_PIPE_LISTENING ConnectNamedPipe() 调用后,发生在我添加 PIPE_NOWAIT 之后。为什么会出现这个错误?我该如何解决?这是添加支持以取消命名管道操作的正确方法吗?我会杀死正在运行 Listen() 的 theread,但我读到它不是一个好的实践(它甚至都不起作用)。

注意:我正在处理现有代码库,我想避免使用 NamedPipeClientStream 重写所有内容由于时间原因。

最佳答案

在 C++ 中,您需要创建具有重叠 io 的文件,然后 WaitForMultipleObjects(..., INFINITE); 用于停止事件和 IO。

如果您收到停止事件,那么您可以CancelIO();

对于 C# msdn : Overlapped允许您创建重叠对象(读取所必需的)。

stackoverflow : pinvoke ReadFile .这显示了如何使用重叠选项本地调用 ReadFile。

stackoverflow : waitformultipleobjects functionality说明如何调用 WaitForMultipleObjects。

在解决这类问题时我创建了一个独立的函数

ReadFileWithEvent( HANDLE file, VOID * pData, size_t data, HANDLE exitEvent, BOOL & signalled );

打包创建一个重叠对象,等待并向调用者解释停止已经发生,并且读取尚未完成。这简化了我需要的代码。

关于c# - 如何取消 PIPE 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33266548/

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