2

スクレイピング用の URL のコレクションがあり、厳密に型指定された結果のコレクションを返しながら、リソースを並行してダウンロードしたいと考えています。

WebClient.DownloadString() と " MyTypedResult Process(string s)"を持つ

string[] urls => IEnumerable<MyTypedResult>変換を行うにはどうすればよいですか?

string[] urls = {"url1","url2","url3"};
List<MyTypedResult> ResultCollection = new List<MyTypedResult>();
foreach (var u in urls)
{
    WebClient wc = new WebClient();
    var content = wc.DownloadString(u);
    MyTypedResult r = Process(content);
    ResultCollection.Add(r);
}

Web リクエストを並行して実行したいのですが、リスト内の結果のコレクションが必要です。

4

3 に答える 3

4

.NET 4.5の新しいおもちゃを使用してHttpClient、結果を並行して取得できます。

var httpClient = new HttpClient();

var tasks = urls.Select(url => httpClient.GetStringAsync(url)
                        .ContinueWith(task =>
                        {
                            string response = task.Result;
                            return ConvertToStrongType(response);
                        }));

 Task.WaitAll(tasks.ToArray());
 var results = tasks.Select(t => t.Result);
于 2013-02-07T09:40:16.950 に答える
2

これは Rx バージョンHttpClientです:

var urls = new[] { "url1", "url2", "url3" };
var client = new HttpClient();
var results = from url in urls.ToObservable()
              from content in client.GetStringAsync(url).ToObservable()
              select Process(content);
var enumerable = results.ToEnumerable();
于 2013-02-08T10:28:26.930 に答える
1

以下はコードです。Parallel.ForEach を使用して、url からコンテンツを並列ダウンロードします。ConcurrentList を使用して、スレッド ロックの問題を発生させずにコレクションを並行して設定する必要があります。

void YourTask()
{
    string[] urls = {"url1","url2","url3"};
    ConcurrentList<MyTypedResult> ResultCollection = new ConcurrentList<MyTypedResult>();

    Parallel.ForEach(urls, url => 
    {
        GetData(url);
        ResultCollection.TryAdd(myTypedResult);
    );

    //on this line all parallel task will be completed and ResultCollection will be filled with the results

}

MyTypedResult GetData(string url)
{
   WebClient wc = new WebClient();
    var content = wc.DownloadString(url);
    MyTypedResult r = Process(content);
    return r;
}
于 2013-02-07T10:37:14.697 に答える