如何解锁ConnectNamedPipe和ReadFile? [C#]

时间:2009-08-30 06:45:13

标签: c# c++ pinvoke pipe named-pipes

我有一个类(NamedPipeManager),它有一个线程(PipeThread),它使用(ConnectNamedPipe)等待NamedPipe连接,然后读取(ReadFile) - 这些是阻塞调用(不重叠) - 但有一点我想解锁它们 - 例如当调用类试图停止NamedPipeManager ...

我怎样才能中断它?使用Thread.abort?了Thread.interrupt?有没有正确的方法来处理这个? 请参阅下面的代码,其中说明了我目前的情况

main()
{
    NamedPipeManager np = new NamedPipeManager();
        ... do stuff ...
    ... do stuff ...
    np.Stop();      // at this point I want to stop waiting on a connection
}


class NamedPipeManager
{
private Thread PipeThread;

public NamedPipeManager
{
    PipeThread = new Thread(new ThreadStart(ManagePipes));
    PipeThread.IsBackground = true;
    PipeThread.Name = "NamedPipe Manager";
    PipeThread.Start();
}

private void ManagePipes()
{
    handle = CreateNamedPipe(..., PIPE_WAIT, ...);
    ConnectNamedPipe(handle, null);     // this is the BLOCKING call waiting for client connection

    ReadFile(....);             // this is the BLOCKING call to readfile after a connection has been established
    }


public void Stop()
{
    /// This is where I need to do my magic
    /// But somehow I need to stop PipeThread
    PipeThread.abort();     //?? my gut tells me this is bad
}
};

所以,在函数Stop()中 - 我如何优雅地解锁对ConnectNamedPipe(...)或ReadFile(...)的调用?

任何帮助将不胜感激。 谢谢,

2 个答案:

答案 0 :(得分:5)

从Windows Vista开始,可以为线程提供CancelSynchronousIO操作。我不认为它有一个C#包装器,所以你需要使用PInvoke来调用它。

在Vista之前,没有办法优雅地执行这样的操作。我建议不要使用线程取消(这可能有效,但不符合优雅)。您最好的方法是使用重叠IO。

答案 1 :(得分:5)

如果我尝试中断ConnectNamedPipe,似乎正在使用VC6.0,WinXP DeleteFile("\\\\.\\pipe\\yourpipehere");

所以只需指定名称,而不是处理。