TcpClient
のBeginAcceptTcpClient()
メソッドを使用するスレッドがあります。これは次のようになります。
// 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のヒント。進行中の可能性のある非同期操作を効果的にキャンセルするために従う必要のある別のパターンはありますか?