0

This question には、非同期を実行する方法に関する優れた回答HttpWebRequestがありました。

このメソッドで非同期に取得したい 50,000 以上の URL のリストがあります。私が遭遇した問題は、すべての非同期リクエストが完了する前にメインスレッドが完了して終了することです。

、およびコールバックメソッドを呼び出すManualResetEventために使用できることがわかりました。リクエストを 1 つだけ実行する場合、これはうまく機能します。多くのリクエストでこれを処理する方法がわかりません。WaitOne()Set()

4

1 に答える 1

1

TPLを使用できます。

using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        var urls = new[] 
        { 
            "http://www.google.com", 
            "http://www.yahoo.com" 
        };

        var tasks = urls.Select(url =>
        {
            var request = WebRequest.Create(url);
            return Task
                .Factory
                .FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, url)
                .ContinueWith(t =>
                {
                    if (t.IsCompleted)
                    {
                        using (var stream = t.Result.GetResponseStream())
                        using (var reader = new StreamReader(stream))
                        {
                            Console.WriteLine("-- Successfully downloaded {0} --", t.AsyncState);
                            Console.WriteLine(reader.ReadToEnd());
                        }
                    }
                    else if (t.IsFaulted)
                    {
                        Console.WriteLine("There was an error downloading {0} - {1}", t.AsyncState, t.Exception);
                    }
                });
        }).ToArray();

        Task.WaitAll(tasks);
    }
}
于 2012-10-15T15:26:52.427 に答える