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

本文关键字:WebRequest 处理 线程 等待 | 更新日期: 2023-09-27 18:20:50

我正在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]);

我还有一个功能,可以从url 获得响应

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);
}

我在里面放了一些测试打印,用上面的代码,程序看起来像是启动了所有线程,但在所有线程通过之前就终止了,每次都不一样。

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

问题:有没有一种方法可以在不使用Console.ReadLine();的情况下等待所有线程完成,然后继续下一步?

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

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

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;