2

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 を使用しています。

4

1 に答える 1

1

Andy が述べたように、Windows 8 Consumer Preview を Windows 8 RTM (および Visual Studio) に更新した後、この問題はなくなりました。

于 2012-08-17T18:38:28.027 に答える