我正在编写一个程序,其中一个程序需要下载一个给定URL的文件。我太懒了,无法手动实现HTTP/HTTPS协议,所以我需要一些库/对象/函数来完成这项工作。
关键要求
下载
必须
保持异步。也就是说,发布下载的线程必须能够在“下载”文件时执行其他操作,而且下载必须能够在任何时候中止,而不会产生任何野蛮的副作用(例如内部调用
TerminateThread
)
很高兴有要求:
-
应能将文件下载到内存中。意味着-在文件到达时读取其内容,不必将其保存到某个“文件系统”文件中。
-
最好有一些方便的win32进程通知机制(可等待事件、semapore、完成端口等),而不是定期地轮询下载状态。
我选择了
XmlHttpRequest
要执行此工作的COM对象。它似乎工作得很好,而且支持异步模式。
不过,我注意到,过了一段时间,它就停止工作了。
也就是说,在几个成功的文件下载之后,它将停止下载任何内容。
我定期对它进行投票以了解其状态,它报告“正在进行”,但实际上没有发生任何事情,也没有网络活动。此外,当同一进程创建
XMLHTTPROQUEST
执行新下载的对象-效果相同。对象报告“正在进行”,而它甚至不尝试连接到服务器(根据网络嗅探器和系统TCP状态)。
使此对象恢复工作的唯一方法是重新启动进程。这让我怀疑有一种虫子(对不起,我是说
未记录的功能
)在对象中。另外,它不是单个对象级别的bug,因为当对象被破坏并创建另一个对象时,问题仍然存在。可能是实现该对象的dll的某个全局状态。
有人知道这件事吗?这是已知的错误吗?
我很确定在我的代码中不可能有另一个bug,因为在我看来,这个bug在
XMLHTTPROQUEST
. 我做了大量的测试,花了大量的时间和调试程序一起得出结论,毫无疑问,这只是对象停止工作。
顺便说一句,虽然对象应该工作,但我通过
MsgWaitXXXX
API调用。因此,如果此对象需要消息循环才能正常工作(例如,它可以创建一个隐藏的通知窗口并通过
WSAAsyncSelect
)-我给它机会。