我一直在阅读很多关于ThreadPools,Tasks和Threads的内容。过了一会儿,我对整件事感到很困惑。很多人都说每个人都有消极/积极的事情......也许有人可以帮助我找到解决问题的方法。我在这里创建了一个简单的图表,以便更好地理解我的观点。
左边是一个需要处理的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...
}
}
答案 0 :(得分:0)
正如@fendorio和@ ps2goat所指出的,async await非常适合你的场景。这是另一篇msdn文章
答案 1 :(得分:0)
在我看来,您正试图在网络服务器中复制网络服务器。
每个Web请求都在Web服务器中启动自己的线程。由于这些请求可以来自可以访问服务器的任何地方,因此服务器本身只能访问或管理它们(以干净的方式)。
如果您想处理请求并跟踪它们,就像我相信您所要求的那样,AJAX请求将是执行此操作的最佳方式。这样,您可以让服务器尽可能地管理线程和请求,但您可以管理它们的进度并通过JSON返回结果监视它们。
了解jQuery.ajax有关如何执行此操作的一些想法。
答案 2 :(得分:0)
为了以简单的方式实现上述功能,我宁愿为每个任务调用BackgroundWorker。您可以跟踪进度,并在任务完成时收到通知。 选择此选项的另一个原因是所提到的任务看起来像一个后端作业,而不是与UI紧密结合。 这是一个msdn link