2

我有一个应用程序,它有助于使用 http 请求将文件上传到服务器。我正在使用 HttpSendRequestEx 和 HttpEndRequest 进行文件上传。它工作正常。并且上传是在一个单独的线程中执行的。其中要上传的文件会被一一处理。

现在一个新的要求是用户应该能够随时取消上传。由于上传是在一个线程内执行的,目前我对此没有任何控制权。

因此,作为一种解决方法,我所做的是,当用户单击取消上传的按钮时,以下 HINTERNET 句柄

  hSession returned from InternetOpen
  hConnect returned from InternetConnect
  hRequest returned from HttpOpenRequest

已使用 InternetClosehandle 函数关闭。

由于这些句柄在线程内部使用,因此无法直接访问。所以我已经将它们声明为线程运行的类的静态成员。这样我可以在发生按钮单击时直接访问它。

通过这样做,正在处理的请求会立即被取消。但我不知道这是否是一个好方法。所以我想知道在进行这个逻辑时是否存在任何安全问题..

还有比这更好的选择吗......

请对此发表评论。期待专家对此的建议..

提前致谢

4

1 回答 1

2

从 TCP 套接字的角度来看,这是中断请求的正确方法:关闭套接字以停止和关闭在不同线程上执行某些工作的连接是完全合法的。

也就是说,WinInet 不仅仅是一个套接字的包装器,因此我们不能确定没有资源或内存泄漏。

我将通过编写一个测试程序来测试它,该程序会创建大量此类中断的上传,并在Process Explorer中进程的 Performance 选项卡上查找资源泄漏。我会特别注意句柄计数,可能还有虚拟内存。

此外,在关闭句柄之前,您可以尝试通过调用 HttpEndRequest() 来关闭 HTTP 连接,这可能会清理更多内容。

于 2012-09-27T06:45:52.077 回答