我正在开发一个从各种服务收集数据的异步 Http 爬虫,目前,我正在使用执行串行 HttpWebRequest 调用以从服务发布/获取数据的线程池。
我想过渡到异步 Web 调用(BeginGetRequestStream 和 BeginGetResponse),我需要一些方法来获取响应数据和 POST 统计信息(写入完成的百分比,完成时(完成时更重要)等)。我目前有一个从生成/包含线程的对象调用的事件,表明已收到 HTTP 数据。我可以附加到 WebRequests 中的事件来调用已经实现的事件吗?这将是最无缝的过渡。
感谢您的帮助!
最佳答案
我刚刚从 this article 复制/粘贴(并编辑)了以下代码关于异步 Web 请求。它展示了一种基本模式,即如何以某种有条理的方式编写异步代码,同时跟踪哪些响应与哪些请求等。当您完成响应时,只需触发一个事件通知 UI响应完毕。
private void ScanSites ()
{
// for each URL in the collection...
WebRequest request = HttpWebRequest.Create(uri);
// RequestState is a custom class to pass info
RequestState state = new RequestState(request, data);
IAsyncResult result = request.BeginGetResponse(
new AsyncCallback(UpdateItem),state);
}
private void UpdateItem (IAsyncResult result)
{
// grab the custom state object
RequestState state = (RequestState)result.AsyncState;
WebRequest request = (WebRequest)state.request;
// get the Response
HttpWebResponse response =
(HttpWebResponse )request.EndGetResponse(result);
// fire the event that notifies the UI that data has been retrieved...
}
请注意,您可以将 RequestState 对象替换为您想要的任何类型的对象,以帮助您跟踪事物。
您可能已经这样做了,但如果没有,我相信这是解决问题的完全可接受且干净的方法。如果这不是您想要的,请告诉我。
关于c# - HttpWebRequest.Begin GetRequestStream() 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5098494/