Sockets 在Metro中处理插座创建/销毁泄漏

Sockets 在Metro中处理插座创建/销毁泄漏,sockets,microsoft-metro,windows-runtime,memory-leaks,c++-cx,Sockets,Microsoft Metro,Windows Runtime,Memory Leaks,C++ Cx,我正在尝试在Windows8Metro下编写网络应用程序。 我的应用程序需要在运行时创建/销毁一些套接字。在尝试研究WinRT的网络API时,我发现了以下问题—我的进程在创建/销毁套接字的同时不断增加其句柄数。 为了确认我已编写了以下示例: task<void>( []() { // <checkpoint 1> for(int i=0; i < 200; i++) { // create socket DatagramSocket

我正在尝试在Windows8Metro下编写网络应用程序。 我的应用程序需要在运行时创建/销毁一些套接字。在尝试研究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(循环之后):

根据这一点,我的应用程序不断泄漏计时器、WaitCompletionPackage和其他句柄。 (我试着在循环后等待一段时间,或者在循环中插入延迟,希望工人们能完成他们的工作,但没有任何帮助)。 那么这个示例有什么问题,我应该如何创建/绑定/销毁套接字对象呢?
我使用的是Windows 8 Consumer Preview,build 8400。

正如Andy提到的,在将Windows 8 Consumer Preview更新到Windows 8 RTM(以及Visual Studio)之后,问题就解决了。

您是否尝试打印
hr
的值?从第二次开始,将多个套接字绑定到同一端口可能会失败。。。通过稍微扩展一下,我可以说您的
ASSERT
悄悄地使顶级任务崩溃,而deleted不被调用。。。(尽管这个想法有很多可能是错误的,以防万一)。当然。人力资源部一直都很好。如果我注释“deletesocket;”,Assert将激发。在这种情况下,套接字关闭操作似乎被延迟(由工作线程),可能会干扰下一个循环迭代。您的代码看起来很好。这可能是C++/CX中的漏洞,也可能是消费者预览版本中的PPL扩展中的漏洞。无论如何,对于VS和RTM Windows 8的RTM版本,我无法重现此漏洞,因此您应该在更新到RTM时发现此漏洞已修复。谢谢!刚刚在全新的Windows8RTM环境中测试了它,并确认了您所说的。
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
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