我正在编写一个程序,除了其他东西之外,还需要下载一个给定URL的文件。我懒得手动实现Http / Https协议,因此我需要一些能够完成工作的库/对象/函数。
关键要求:下载必须是异步的。也就是说,发出下载的线程必须能够“在”下载文件时执行其他操作,并且下载必须能够在任何时候中止而没有任何野蛮的副作用(例如内部调用TerminateThread
)
满足要求:
我选择XmlHttpRequest
COM对象来完成工作。它似乎工作得很好,加上它支持异步模式。
但是我注意到经过一段时间后它才停止工作。 也就是说,在几次成功下载文件后,它会停止下载任何内容。
我定期轮询它以获得其状态,它报告“正在进行中”,但实际上没有发生任何事情,并且没有网络活动。此外,当同一进程创建另一个XmlHttpRequest
对象实例以执行新下载时 - 效果是相同的。该对象报告“正在进行中”,而它甚至没有尝试连接到服务器(根据网络嗅探器和系统TCP状态)。
使此对象恢复工作的唯一方法是重新启动该过程。这让我怀疑对象中存在一种错误(抱歉,我的意思是未记录的功能)。此外,它不是单个对象级别的错误,因为当对象被销毁并且另一个对象被创建时问题仍然存在。它可能是DLL的一些全局状态,它实现了这个对象。
有人对此有所了解吗?这是一个已知的错误?
我很确定我的代码中没有其他错误,因为我觉得这个错误在XmlHttpRequest
中。我已经做了足够多的测试并花时间与调试器一起得出结论,毫无疑问它只是对象停止工作。
顺便说一句,虽然对象应该可以工作,但我会通过MsgWaitXXXX
API调用等待所有操作。因此,如果此对象需要消息循环正常工作(例如,它可能会创建一个隐藏的通知窗口并通过WSAAsyncSelect
将其绑定到套接字) - 我给它机会。
答案 0 :(得分:1)
根据我自己的经验,我知道XmlHttpRequest的Microsoft实现不能完全符合draft standard。特别是流式数据的标准要求应该能够在IE deliberately ignores的就绪状态“3”(接收)中提取。
不幸的是,尽管广泛使用XmlHttpRequest对象进行长轮询,但我还没有看到你所描述的内容。