并行编程c# - TPL -更新共享变量建议

本文关键字:共享变量 更新 TPL 编程 并行 | 更新日期: 2023-09-27 17:54:29

我是并行编程的新手,事实上这是我第一次尝试。我目前正在做一个。net 4的项目,希望有4到5个并行执行。

我看到一些选项。有Task.Factory.StartNewParallel.ForParallel.ForEach

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

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

我有兴趣在for循环中使用Task.Factory.StartNew,并将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>吗?

你知道一个很好的资源,帮助学习访问和更新一个共享变量的多个任务等?

对于这种类型的任务,你可能认为我可以使用的最佳方法是什么?

并行编程c# - TPL -更新共享变量建议

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