0

私は並列プログラミングに不慣れであり、実際、これは私がそれを試すのは初めてです。私は現在.NET4でプロジェクトを行っており、4つまたは5つの並列実行を希望しています。

いくつかのオプションがあります。ありますTask.Factory.StartNew Parallel.For Parallel.ForEachなど。

私がやろうとしているのは、Webサイトに投稿し、約200のURLの応答を取得することです。

私が使用したときParallel.ForEach、スレッドの数を制御する方法が見つかりませんでした。アプリケーションは130以上のスレッドを使用し、Webサイトは応答しなくなりました:)

Task.Factory.StartNewforループ内で使用し、URLを4つまたは5つのタスクに分割することに興味があります。

List<Task> tasks = new List<Task>();
for (int i = 0; i < 5; i++)
{
    List<string> UrlForTask = GetUrlsForTask(i,5); //Lets say will return some thing like 1 of 5 of the list of URLs
    int j = i;
    var t = Task.Factory.StartNew(() =>
    {
        List<PageSummary> t = GetSummary(UrlForTask);
        Summary.AddRange(t); //Summary is a public variable
    }
    tasks.Add(t);
}

これらのタスクは、スレッドに要約されると思います。Summaryそれで、私List<PageSummary>がそれをスレッドセーフにする場合(複数のスレッドによる共有変数へのアクセスに問題があることを理解しています)?

これは私たちが使うべき場所ConcurrentQueue<T>ですか?

複数のタスクなどによる共有変数へのアクセスと更新について学ぶのに役立つ優れたリソースを知っていますか?

あなたが思うかもしれないように、私がこのタイプのタスクに使用できる最良の方法は何ですか?

4

1 に答える 1

3

Parallel.ForEachインスタンスを取るオーバーロードがありParallelOptionsます。そのMaxDegreeOfParallelismクラスのプロパティは、使用する必要があるものです。

List<MyRequest> requests = ...;
BlockingCollection<MyResponse> responses = ...;
Task.Factory.StartNew(() =>
{
    Parallel.ForEach(
        requests,
        new ParallelOptions { MaxDegreeOfParallelism = 4 },
        request => responses.Add(MyDownload(request)));
    responses.CompleteAdding();
});

foreach (var response in responses.GetConsumingEnumerable())
{
    Console.WriteLine(response.MyMessage);
}
于 2013-01-17T20:14:50.010 に答える