7

(ConnectNamedPipe) を使用して NamedPipe 接続を待機し、次に (ReadFile) を読み取るスレッド (PipeThread) を持つクラス (NamedPipeManager) があります。これらは呼び出しをブロックしています (重複していません)。それらのブロックを解除します-たとえば、呼び出し元のクラスが NamedPipeManager を停止しようとした場合...

どうすれば中断できますか?Thread.abort を使用していますか? スレッド割り込み? これを処理する適切な方法はありますか?私の現在の状況を示す以下のコードを参照してください

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(...) への呼び出しを適切にブロック解除するにはどうすればよいでしょうか?

どんな助けでも大歓迎です。ありがとう、

4

2 に答える 2

7

で割り込もうとするとVC6.0、WinXPで動いているようConnectNamedPipeです DeleteFile("\\\\.\\pipe\\yourpipehere");

したがって、ハンドルではなく、名前を指定するだけです。

于 2011-10-21T08:58:51.607 に答える
5

Windows Vista 以降では、スレッドで使用できるCancelSynchronousIO操作があります。C# ラッパーはないと思うので、PInvoke を使用して呼び出す必要があります。

Vista より前のバージョンでは、このような操作を適切に実行する方法は実際にはありませんでした。スレッド キャンセルを使用しないことをお勧めします (うまくいくかもしれませんが、適切とは言えません)。あなたの最善のアプローチは、重複した IO を使用することです。

于 2009-08-30T06:59:59.490 に答える