Windows 8 Metro でネットワーク アプリケーションを作成しようとしています。私のアプリケーションは、実行時にある程度のソケットを作成/破棄する必要があります。WinRT のネットワーク API を調べようとしているときに、次の問題が見つかりました。プロセスがソケットを作成/破棄している間、ハンドル カウントが継続的に増加します。次のサンプルを書いたことを確認するには:
task<void>( []()
{
// <checkpoint 1>
for(int i=0; i < 200; i++)
{
// create socket
DatagramSocket ^socket = ref new DatagramSocket();
// perform binding operation synchronously
HRESULT hr = S_OK;
HostName ^localHostName = ref new HostName(L"127.0.0.1");
String ^localServiceName = L"10000";
create_task( socket->BindEndpointAsync(localHostName, localServiceName) ).then(
[&hr] (task<void> previousTask)
{
try
{
previousTask.get(); // get exception
}
catch (Exception^ exception)
{
hr = exception->HResult;
}
}).wait();
ASSERT( SUCCEEDED(hr) );
// close socket
delete socket; // C++ version of DatagramSocket.Close(), see MSDN
socket = nullptr;
}
// <checkpoint 2>
});
このタスクはメイン アプリのスレッドで作成されます。および に 2 つのブレークポイントを設定し、そこで Sysinternal の Handle ユーティリティを実行します。
チェックポイント 1 (create/destroy ループを開始する前):
Handle type summary:
ALPC Port : 10
Desktop : 1
Directory : 4
EtwRegistration : 34
Event : 40
File : 3
IoCompletion : 2
Key : 17
Mutant : 1
Section : 5
Semaphore : 4
Thread : 9
Timer : 7
TpWorkerFactory : 2
WaitCompletionPacket: 7
WindowStation : 2
Total handles: 148
チェックポイント 2 (ループ後):
Handle type summary:
ALPC Port : 9
Desktop : 1
Directory : 4
EtwRegistration : 40
Event : 80
File : 5
IoCompletion : 145
Key : 20
Mutant : 1
Section : 5
Semaphore : 6
Thread : 26
Timer : 291
TpWorkerFactory : 144
WaitCompletionPacket: 295
WindowStation : 2
Total handles: 1074
これによると、私のアプリはタイマー、WaitCompletionPacket、およびその他のハンドルを継続的にリークしています。(私は、ループの後にしばらく待つか、ループに遅延を挿入して、ワーカーが作業を行うことを望んでいますが、何も助けにはなりませんでした)。では、このサンプルの何が問題なのですか? また、ソケット オブジェクトを作成/バインド/破棄する方法を教えてください。Windows 8 Consumer Preview、ビルド 8400 を使用しています。