1

私はむしろTcpClientそのスピンを使ってクラスを持ってThreadwhile (!streamReader.EndOfStream) {}ますNetworkStream。TCP 接続が開いていて、読み取るデータがない限り、EndOfStream実行がブロックされるため、スレッド外からの読み取りを中止するにはどうすればよいでしょうか。

がブロックされているため、呼び出されEndOfStreamたプライベート フィールドを設定しても (少なくとも私のテストでは) 単独ではあまり効果がありません。そのため、私が行ったことは次のとおりです。stoptrue

// Inside the reading thread:

try
{
    StreamReader streamReader = new StreamReader(this.stream);

    while (!streamReader.EndOfStream)
    {
        // Read from the stream
    }
}
catch (IOException)
{
    // If it isn't us causing the IOException, rethrow
    if (!this.stop)
        throw;
}

// Outside the thread:

public void Dispose()
{
    // Stop. Hammer Time!
    this.stop = true;

    // Dispose the stream so the StreamReader is aborted by an IOException.
    this.stream.Dispose();
}

これは a からの読み取りを中止するための推奨される方法ですか、NetworkStreamそれとも安全に (ただし強制的に) すべてを破棄するために使用できる他の手法はありますか?

4

1 に答える 1

0

スレッドを中止する必要があります。すでにを使用しているのでtry/catch、スレッドを中止すると(例外が発生します)、正常にキャッチされ、ストリームを閉じるなどの状況に対処できます。

スレッドを中止することについての主なこと(多くの人はそれを決してやらないことだと考えています)は、それを中止するときのスレッドはどこにあり、その結果は何であるかです。処理できれば、スレッドを中止してもかまいません。

于 2011-04-07T10:29:39.240 に答える