【发布时间】:2010-05-24 21:39:16
【问题描述】:
我正在编写一个程序,除其他事项外,它需要根据其 URL 下载文件。我懒得手动实现 Http/Https 协议,所以我需要一些库/对象/函数来完成这项工作。
关键要求:下载必须是异步的。也就是说,发出下载的线程必须能够“在”下载文件的同时做其他事情,而且下载必须能够随时中止而没有任何野蛮的副作用(例如对TerminateThread的内部调用)。
很好的要求:
- 应该能够将文件下载到“内存中”。意味着 - 在文件到达时读取文件的内容,不一定将其保存到某个“文件系统”文件中。
- 最好有一些方便的 Win32 进度通知机制(等待事件、semahpore、完成端口等),而不仅仅是定期轮询下载状态。
我选择了XmlHttpRequest COM 对象来完成这项工作。它似乎工作得很好,而且它支持异步模式。
但是我注意到一段时间后它会停止工作。 也就是说,在多次成功下载文件后,它会停止下载任何内容。
我定期轮询它以获取其状态,它报告“进行中”,但实际上什么也没发生,也没有网络活动。此外,当同一进程创建另一个XmlHttpRequest 对象实例以执行新下载时 - 效果是相同的。该对象报告“进行中”,但它甚至不尝试连接到服务器(根据网络嗅探器和系统 TCP 状态)。
使该对象恢复工作的唯一方法是重新启动该过程。这让我怀疑对象中存在某种错误(抱歉,我的意思是未记录的功能)。这也不是单个对象级别的错误,因为当对象被销毁并创建另一个对象时问题仍然存在。可能是实现此对象的 DLL 的某种全局状态。
有人知道吗?这是一个已知的错误?
我很确定我的代码中不可能有另一个错误,因此在我看来,错误在XmlHttpRequest 中。我已经完成了足够多的测试,并花时间在调试器上,毫无疑问地得出结论,这只是对象停止工作。
顺便说一句,虽然对象应该可以工作,但我通过MsgWaitXXXX API 调用完成所有等待。因此,如果该对象需要消息循环才能正常工作(例如,它可能会创建一个隐藏的通知窗口并通过WSAAsyncSelect 将其绑定到套接字)- 我给它机会。
【问题讨论】:
-
我只是写了一个小测试程序,没有发现任何问题;你能生成一个显示问题的最小代码示例吗?