等待所有线程完成处理每个WebRequest

时间:2013-07-03 18:51:10

标签: c# .net multithreading httpwebrequest threadpool

我正在使用C#.Net4.0构建一个线程程序,我遇到了一些问题。

我正在使用线程池和回调。下面是我在Main()中的代码。

string[] urls = { url1, url2, url3, url4 };
callBack = new WaitCallback(PooledFunc);
for (int i = 0; i < urls.Length; i++)
    ThreadPool.QueueUserWorkItem(callBack, urls[i]);

我还有一个可以从网址获得响应的函数

static void PooledFunc(object url)
{
    HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;

    // Get the response.
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream Answer = response.GetResponseStream();

    // Display the status.
    Console.WriteLine(response.Headers);
    StreamReader _Answer = new StreamReader(Answer);

    string content = _Answer.ReadToEnd();
    Console.WriteLine(content);
}

我在那里放了一些测试打印件,并且使用上面的代码,程序看起来像启动所有线程但在所有线程完成之前终止,并且每次都不同。

当我在for循环之后放置Console.ReadLine();时,它看起来好像等待所有线程完成。

问题:有没有办法可以等到所有线程都完成后再继续使用Console.ReadLine();进行下一步?

1 个答案:

答案 0 :(得分:2)

您可以使用ThreadPool.QueueUserWorkItem来完成同样的事情,而不是使用Parallel.ForEach

string[] urls = { url1, url2, url3, url4 };
Parallel.ForEach(urls, url => PooledFunc(url));

Parallel.ForEach在完成所有项目处理后才会返回。

这也使您可以更好地保持PooledFunc声明:

static void PooledFunc(string url) // Can keep this strongly typed
{
    HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;