0

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

私はそこにいくつかのテストプリントを入れました.上記のコードでは、プログラムはすべてのスレッドを開始したように見えますが、すべてが完了する前に終了し、毎回異なります.

for ループの後に置くConsole.ReadLine();と、すべてのスレッドが完了するまで待機しているように見えます。

質問:すべてのスレッドが終了するまで待ってから、を使用せずに次のステップに進む方法はありConsole.ReadLine();ますか?

4

1 に答える 1

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;
于 2013-07-03T19:00:11.460 に答える