2009-08-30 32 views
6

私は、(ConnectNamedPipe)を使用してNamedPipe接続を待ってから(ReadFile)を読み込むスレッド(PipeThread)を持つクラス(NamedPipeManager)を持っています。例えば、呼び出し側のクラスがNamedPipeManagerを停止しようとしたときなど...ConnectNamedPipeとReadFileのブロックを解除するにはどうすればいいですか? [C#]

どうやってそれを混ぜることができますか? 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 
} 
}; 

を示し、その下のコードを参照してください - どのように私は優雅にConnectNamedPipe(...)またはのReadFile(...)への呼び出しのブロックを解除するのでしょうか?

ご協力いただければ幸いです。 ありがとう、

答えて

4

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

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

+0

これは両方のケース(ConnectNamedPipeとReadFile)に適用されますか? ConnectNamedPipeは、ブロックを解除して終了する(ブールに基づいて)接続を偽装することで見つけることができますが、ReadFileのブロックをどのように解除するのか分かりません... 完了?このような状況を処理するには、非同期的な方法がいくつかあります。 – Shaitan00

+0

BTW - これはWindows 2000とXP上で動作するようになっています。Vistaはいつでもすぐに.. .Net 2.0を使用しています... ありがとう、 – Shaitan00

+0

すべての操作でタイムアウトを指定し、ポーリングを実行します(つまり、1秒間の読み取り操作を実行してから、スレッドが中止する必要があるかどうかを確認します。そうでない場合は、読み取りを続行します)。しかし、マイクロソフトは実際にタイムアウトを信じていないようですので、それらを指定するAPIはありません。また、http://stackoverflow.com/questions/593175/breaking-readfile-blocking-named-pipe-windows-api –

3

私がConnectNamedPipe

DeleteFile("\\\\.\\pipe\\yourpipehere"); によりを中断しようとするのであれば、単にハンドル名を指定しないVC6.0、WinXPの上で動作しているようです。

+0

実際、DeleteFileは内部的に名前でファイルハンドルを開きます。したがって、CreateFile()を呼び出すのと同じです。 –

関連する問題