0

我是并行编程的新手,事实上这是我第一次尝试它。我目前正在.NET 4 中做一个项目,并且更喜欢有 4 或 5 个并行执行。

我看到了一些选择。有Task.Factory.StartNew Parallel.For Parallel.ForEach等。

我要做的是发布到一个网站并获取大约 200 个 URL 的响应。

当我使用时,Parallel.ForEach我没有找到控制线程数的方法,应用程序使用了 130 多个线程并且网站没有响应:)

我有兴趣在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 回答