标签: parallel.foreach

我怎样才能限制Parallel.ForEach?

我有一个Parallel.ForEach()异步循环,我下载了一些网页.我的带宽有限,所以我每次只能下载x页,但Parallel.ForEach会执行所需网页的完整列表.

有没有办法在运行Parallel.ForEach时限制线程号或任何其他限制器?

演示代码:

Parallel.ForEach(listOfWebpages, webpage => {
  Download(webpage);
});
Run Code Online (Sandbox Code Playgroud)

真正的任务与网页无关,因此创意网络抓取解决方案无济于事.

.net c# asynchronous parallel.foreach

282
推荐指数
5
解决办法
14万
查看次数

如何将此foreach代码转换为Parallel.ForEach?

我有点困惑Parallel.ForEach.它究竟
是什么Parallel.ForEach以及它究竟做了什么?
请不要引用任何MSDN链接.

这是一个简单的例子:

string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);

foreach (string line in list_lines)
{
    //My Stuff
}
Run Code Online (Sandbox Code Playgroud)

我该如何重写这个例子Parallel.ForEach

c# multithreading .net-4.0 parallel.foreach

174
推荐指数
5
解决办法
22万
查看次数

在Parallel.ForEach中嵌套等待

在metro应用程序中,我需要执行许多WCF调用.有大量的调用,所以我需要在并行循环中进行调用.问题是并行循环在WCF调用完成之前退出.

你会如何重构这个按预期工作?

var ids = new List<string>() { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
var customers = new  System.Collections.Concurrent.BlockingCollection<Customer>();

Parallel.ForEach(ids, async i =>
{
    ICustomerRepo repo = new CustomerRepo();
    var cust = await repo.GetCustomer(i);
    customers.Add(cust);
});

foreach ( var customer in customers )
{
    Console.WriteLine(customer.ID);
}

Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)

c# wcf task-parallel-library async-await parallel.foreach

159
推荐指数
9
解决办法
10万
查看次数

Parallel.ForEach vs Task.Run和Task.WhenAll

使用Parallel.ForEach或Task.Run()以异步方式启动一组任务有什么区别?

版本1:

List<string> strings = new List<string> { "s1", "s2", "s3" };
Parallel.ForEach(strings, s =>
{
    DoSomething(s);
});
Run Code Online (Sandbox Code Playgroud)

版本2:

List<string> strings = new List<string> { "s1", "s2", "s3" };
List<Task> Tasks = new List<Task>();
foreach (var s in strings)
{
    Tasks.Add(Task.Run(() => DoSomething(s)));
}
await Task.WhenAll(Tasks);
Run Code Online (Sandbox Code Playgroud)

c# async-await parallel.foreach

144
推荐指数
2
解决办法
7万
查看次数

Parallel.ForEach()与foreach(IEnumerable <T> .AsParallel())

Erg,我正在尝试使用Reflector在BCL中找到这两个方法,但找不到它们.这两个片段之间的区别是什么?

A:

IEnumerable<string> items = ...

Parallel.ForEach(items, item => {
   ...
});
Run Code Online (Sandbox Code Playgroud)

B:

IEnumerable<string> items = ...

foreach (var item in items.AsParallel())
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

使用一个比另一个有不同的后果吗?(假设我在两个示例的括号内部所做的事情都是线程安全的.)

.net c# parallel-processing multithreading parallel.foreach

140
推荐指数
3
解决办法
7万
查看次数

与异步lambda并行的foreach

我想并行处理一个集合,但是我在实现它时遇到了麻烦,因此我希望得到一些帮助.

如果我想在并行循环的lambda中调用C#中标记为async的方法,则会出现问题.例如:

var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
  // some pre stuff
  var response = await GetData(item);
  bag.Add(response);
  // some post stuff
}
var count = bag.Count;
Run Code Online (Sandbox Code Playgroud)

计数为0时会出现问题,因为创建的所有线程实际上只是后台线程,并且Parallel.ForEach调用不等待完成.如果我删除async关键字,该方法如下所示:

var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
  // some pre stuff
  var responseTask = await GetData(item);
  responseTask.Wait();
  var response = responseTask.Result;
  bag.Add(response);
  // some post stuff
}
var count = bag.Count;
Run Code Online (Sandbox Code Playgroud)

它工作,但它完全禁用等待聪明,我必须做一些手动异常处理..(为简洁起见删除).

如何实现一个Parallel.ForEach在lambda中使用await关键字的循环?可能吗?

Parallel.ForEach方法的原型采用Action<T>as参数,但我希望它等待我的异步lambda.

c# task-parallel-library async-await parallel.foreach

100
推荐指数
6
解决办法
7万
查看次数

打破parallel.foreach?

如何打破parallel.for循环?

我有一个非常复杂的声明,如下所示:

Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
    new Action<ColorIndexHolder>((ColorIndexHolder Element) =>
    {
        if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
        {
            Found = true;
            break;
        }
    }));
Run Code Online (Sandbox Code Playgroud)

使用并行类,我可以到目前为止优化这个过程.然而; 我无法弄清楚如何打破并行循环?该break;语句抛出以下语法错误:

没有封闭的环可以打破或继续

c# parallel-processing multithreading parallel.foreach

95
推荐指数
5
解决办法
5万
查看次数

如何从Parallel.ForEach收集返回值?

我并行调用一个缓慢的Web服务.事情很棒,直到我意识到我需要从服务中获取一些信息.但我不知道在哪里可以获得价值.我无法写入数据库,HttpContext.Current似乎在使用Parallel.ForEach调用的方法内部为null

下面是一个示例程序(在您看来,请想象一个慢速Web服务而不是字符串连接)

using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        WordMaker m = new WordMaker();
        m.MakeIt();
    }
    public class WordMaker
    {
        public void MakeIt()
        {
            string[] words = { "ack", "ook" };
            ParallelLoopResult result = Parallel.ForEach(words, word => AddB(word));
            Console.WriteLine("Where did my results go?");
            Console.ReadKey();
        }
        public string AddB(string word)
        {
            return "b" + word;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

c# c#-4.0 parallel.foreach

54
推荐指数
5
解决办法
4万
查看次数

MaxDegreeOfParallelism有什么作用?

我正在使用Parallel.ForEach并且我正在做一些数据库更新,现在没有设置MaxDegreeOfParallelism,双核处理器机器导致sql客户端超时,否则四核处理器机器不知何故不会超时.

现在我无法控制我的代码运行的哪种处理器内核可用,但是我可以使用MaxDegreeOfParallelism更改某些设置,这些设置可能会同时运行较少的操作而不会导致超时?

我可以增加超时但它不是一个好的解决方案,如果在较低的CPU上我可以同时处理较少的操作,这将减少对CPU的负载.

好的我也读过所有其他帖子和MSDN,但是将MaxDegreeOfParallelism设置为较低值会让我的四核机器遭受损失吗?

例如,无论如何,如果CPU有两个内核,那么使用20,如果CPU有四个内核,那么40?

c# .net-4.0 parallel-extensions task-parallel-library parallel.foreach

49
推荐指数
3
解决办法
5万
查看次数

Parallel.ForEach和async-await

我有这样的方法:

public async Task<MyResult> GetResult()
{
    MyResult result = new MyResult();

    foreach(var method in Methods)
    {
        string json = await Process(method);

        result.Prop1 = PopulateProp1(json);
        result.Prop2 = PopulateProp2(json);

    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

然后我决定使用Parallel.ForEach:

public async Task<MyResult> GetResult()
{
    MyResult result = new MyResult();

    Parallel.ForEach(Methods, async method =>
    {
        string json = await Process(method);    

        result.Prop1 = PopulateProp1(json);
        result.Prop2 = PopulateProp2(json);
    });

    return result;
}
Run Code Online (Sandbox Code Playgroud)

但现在我有一个错误:

在异步操作仍处于挂起状态时完成异步模块或处理程序.

c# task-parallel-library async-await parallel.foreach

37
推荐指数
4
解决办法
4万
查看次数