0

TcpClientBeginAcceptTcpClient()メソッドを使用するスレッドがあります。これは次のようになります。

// this gets set elsewhere
ManualResetEvent _doneListening = new ManualResetEvent(false); 

..そしてスレッド手順で

while (true)
{
    var result = BeginAcceptTcpClient(null, null);

    var index = WaitHandle.WaitAny(new [] { _doneListening, result.AsyncWaitHandle });
    if (0 == index)
    {
        break;
    }

    // do something with EndAcceptTcpClient(result)
}

さて、MSDNのドキュメントによると:

非同期のBeginAcceptTcpClient操作は、EndAcceptTcpClientメソッドを呼び出して完了する必要があります。

私の質問は、私のスレッドのキャンセル/停止の場合に関連しています-つまり、後_doneListening.Set()-私は本当にこれ以上TcpClientsを望んでいません。同時に、私はメモリを漏らしたくありません。

EndAcceptTcpClient()を呼び出す必要がありますか?これはブロックされます、そして私は確かにそれを望んでいません(私は速いスレッド出口が欲しいです)。しかし、そうでなければメモリをリークしますか?BeginはEndとペアにする必要があるというMSDNのヒント。進行中の可能性のある非同期操作を効果的にキャンセルするために従う必要のある別のパターンはありますか?

4

2 に答える 2

2

Begin/EndパターンでEnd*メソッドを呼び出すことをお勧めします。そうしないと、「リーク」するリソースがいくつかあります。を呼び出しTcpListener.Stopてリスナーを閉じてから、を呼び出す必要がありますEndAcceptTcpClient

リスナーが再びバインドされると、Stopは例外をスローする場合があります。したがって、それをチェックするか、チェックする必要があるかもしれませんIsBound(ただし、チェックIsBoundしてから新しいバインディングを取得する可能性がありStopます)...

于 2012-08-29T16:54:29.057 に答える
1

EndAcceptTcpClientTcpClientを閉じたり破棄したりしても、ブロックされません。したがって、聞き取りが終わったら、それを閉じます。EndAcceptTcpClientに応答して例外をスローしますが、それは問題ありません。例外を安全に無視/破棄できます。

于 2012-08-29T15:16:33.397 に答える