sockets - 在 Metro 中处理套接字创建/销毁时的泄漏

标签 sockets microsoft-metro windows-runtime memory-leaks c++-cx

我正在尝试在 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>
});

此任务在主 App 的线程中创建。
我已经设置了 2 个断点并在那里运行 Sysinternal 的 Handle 实用程序:

在检查点 1(在开始创建/销毁循环之前):
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

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

最佳答案

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

关于sockets - 在 Metro 中处理套接字创建/销毁时的泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11987718/

相关文章:

node.js - Node Socket.io客户端连接后认为已断开连接

c - C中的linux套接字和多线程

c# - 使用 HttpClient 检索 Json 数据

c# - Windows Azure 表中的 Like 语句等效项

c++ - 将 Platform::Array<byte> 转换为字符串

c++ - UDP 发送永远不会失败

windows - Windows "netstat -b"如何确定拥有每个套接字的进程的名称?

c# - Windows 8 模态进度对话框(如带有自己的内容和按钮的消息框...)

c# - Metro App 全局变量 C#

xaml - 如果文本太长,如何自动显示工具提示?