C#如何一次处理多个Web请求

时间:2013-12-11 05:54:36

标签: c# multithreading asynchronous task webclient

我一直在阅读很多关于ThreadPools,Tasks和Threads的内容。过了一会儿,我对整件事感到很困惑。很多人都说每个人都有消极/积极的事情......也许有人可以帮助我找到解决问题的方法。我在这里创建了一个简单的图表,以便更好地理解我的观点。

enter image description here

左边是一个需要处理的5个字符串(URL)的列表。在中心只是我的一个处理程序的想法,有2个事件来跟踪进度。在该处理程序中,它需要所有5个URL为它们创建单独的任务,以蓝色显示。一旦完成,我希望每个人都将网页结果返回给处理程序。当他们都返回了一个值时,我希望调用OnComplete并将所有这些信息传递回主线程。

希望你能理解我想要做的事情。提前感谢任何想要帮助的人!

更新 我已经接受了你的建议并将它们付诸实施。但我还有几个问题。这是我建立的代码,介意它不是构建证明,只是一个概念,看看我是否朝着正确的方向前进。请阅读评论,我已经把我的问题包括在那里。感谢所有对我的问题感兴趣的人。

public List<String> ProcessList (string[] URLs)
{
    List<string> data = new List<string>();
    for(int i = 0; i < URLs.Length - 1; i++)
    {
        //not sure how to do this now??
        //I want only 10 HttpWebRequest running at once.
        //Also I want this method to block until all the URL data has been returned.            
    }
    return data;
}

private async Task<string> GetURLData(string URL)
{
    //First setup out web client
    HttpWebRequest Request = GetWebRequest(URL);
    //
    //Check if the client holds a value. (There were no errors)
    if (Request != null)
    {
        //GetCouponsAsync will return to the calling function and resumes
        //here when GetResponse is complete.
        WebResponse Response = await Request.GetResponseAsync();
        //
        //Setup our Stream to read the reply
        Stream ResponseStream = Response.GetResponseStream();

        //return the reply string here...
    }
}

3 个答案:

答案 0 :(得分:0)

正如@fendorio和@ ps2goat所指出的,async await非常适合你的场景。这是另一篇msdn文章

http://msdn.microsoft.com/en-us/library/hh300224.aspx

答案 1 :(得分:0)

在我看来,您正试图在网络服务器中复制网络服务器。

每个Web请求都在Web服务器中启动自己的线程。由于这些请求可以来自可以访问服务器的任何地方,因此服务器本身只能访问或管理它们(以干净的方式)。

如果您想处理请求并跟踪它们,就像我相信您所要求的那样,AJAX请求将是执行此操作的最佳方式。这样,您可以让服务器尽可能地管理线程和请求,但您可以管理它们的进度并通过JSON返回结果监视它们。

了解jQuery.ajax有关如何执行此操作的一些想法。

答案 2 :(得分:0)

为了以简单的方式实现上述功能,我宁愿为每个任务调用BackgroundWorker。您可以跟踪进度,并在任务完成时收到通知。 选择此选项的另一个原因是所提到的任务看起来像一个后端作业,而不是与UI紧密结合。 这是一个msdn link