我有一个类(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(...)的调用?
任何帮助将不胜感激。 谢谢,
答案 0 :(得分:5)
从Windows Vista开始,可以为线程提供CancelSynchronousIO操作。我不认为它有一个C#包装器,所以你需要使用PInvoke来调用它。
在Vista之前,没有办法优雅地执行这样的操作。我建议不要使用线程取消(这可能有效,但不符合优雅)。您最好的方法是使用重叠IO。
答案 1 :(得分:5)
如果我尝试中断ConnectNamedPipe
,似乎正在使用VC6.0,WinXP
DeleteFile("\\\\.\\pipe\\yourpipehere");
所以只需指定名称,而不是处理。