私は、(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(...)への呼び出しのブロックを解除するのでしょうか?
ご協力いただければ幸いです。 ありがとう、
これは両方のケース(ConnectNamedPipeとReadFile)に適用されますか? ConnectNamedPipeは、ブロックを解除して終了する(ブールに基づいて)接続を偽装することで見つけることができますが、ReadFileのブロックをどのように解除するのか分かりません... 完了?このような状況を処理するには、非同期的な方法がいくつかあります。 – Shaitan00
BTW - これはWindows 2000とXP上で動作するようになっています。Vistaはいつでもすぐに.. .Net 2.0を使用しています... ありがとう、 – Shaitan00
すべての操作でタイムアウトを指定し、ポーリングを実行します(つまり、1秒間の読み取り操作を実行してから、スレッドが中止する必要があるかどうかを確認します。そうでない場合は、読み取りを続行します)。しかし、マイクロソフトは実際にタイムアウトを信じていないようですので、それらを指定するAPIはありません。また、http://stackoverflow.com/questions/593175/breaking-readfile-blocking-named-pipe-windows-api –