相关疑难解决方法(0)

Parallel.ForEach是否限制活动线程的数量?

鉴于此代码:

var arrayStrings = new string[1000];
Parallel.ForEach<string>(arrayStrings, someString =>
{
    DoSomething(someString);
});
Run Code Online (Sandbox Code Playgroud)

所有1000个线程几乎会同时产生吗?

.net c# parallel-processing c#-4.0

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

为什么Parallel.ForEach不运行多个线程?

今天我尝试做一些优化foreach声明,这可以继续XDocument.

优化前:

foreach (XElement elem in xDoc.Descendants("APSEvent").ToList())
{
    //some operations
}
Run Code Online (Sandbox Code Playgroud)

优化后:

Parallel.ForEach(xDoc.Descendants("APSEvent").ToList(), elem =>
{
    //same operations
});
Run Code Online (Sandbox Code Playgroud)

我看到.NET Parallel.ForEach(...)只打开一个线程!结果,时间跨度Parallel大于标准foreach.

为什么你认为.NET只开了1个线程?因为锁定文件?谢谢

c# parallel-processing

22
推荐指数
1
解决办法
2万
查看次数

订购PLINQ ForAll

关于PLINQ中的订单保存的msdn文档说明了以下内容ForAll().

  • 订购源序列时的结果:并行执行非确定性
  • 源序列无序时的结果:并行执行非确定性

这是否意味着ForAll永远不能保证该方法的有序执行?

我以前没有使用PLINQ,但以下Code Review问题似乎是适合它的用法.在我的回答的底部,我写道:

Events.AsParallel().AsOrdered().ForAll( eventItem =>
{
    ...
} );    
Run Code Online (Sandbox Code Playgroud)

阅读文档后,我相信AsOrdered()不会改变任何东西?
我也怀疑以前的查询不能取代for顺序很重要的简单循环?
可能StringBuilder会发生与意志的并行调用,导致输出错误?

c# plinq

11
推荐指数
3
解决办法
6444
查看次数

什么时候会并行提高性能

我试图了解何时使用parallel会增加性能.
我用一个运行超过100,000个项目的简单代码对其进行了测试,List<Person>并将每个项目的名称更改为string.Empty.

并行版本比普通版本花费了两倍的时间.(是的,我用更多的核心进行了测试...)

我看到这个答案说一段并不总是并行的数据对性能有好处.
此外,在MSDN教程的并行示例的每一页中都会重复此注意事项:

这些示例主要用于演示用法,可能会或可能不会比等效的LINQ to Objects查询运行得更快

我需要一些规则和提示,当并行将提高我的代码的性能,什么时候不会.
显而易见的答案是"测试你的代码,如果并行循环更快地使用它",这是绝对正确的,但我想没有人在他写的每个循环上运行性能分析.

.net c# parallel-processing performance

4
推荐指数
1
解决办法
1356
查看次数

async/await和Parallel.For循环

我以两种不同的方式运行Parallel.For循环:

  1. 不写任何async/await但只是调用Task ReadSensorAsync(int):

    var watch = System.Diagnostics.Stopwatch.StartNew();
    Parallel.For(3, 38,
    index => {
        ReadSensorsAsync(index);
    });
    watch.Stop();
    Console.WriteLine("Parallel finished in {0} ms", watch.ElapsedMilliseconds);
    
    Run Code Online (Sandbox Code Playgroud)

    时间显示 1ms

  2. 跑步 async/await

    var watch = System.Diagnostics.Stopwatch.StartNew();
    Parallel.For(3, 38,
    async index => {
        await ReadSensorsAsync(index);
    });
    watch.Stop();
    Console.WriteLine("Parallel finished in {0} ms", watch.ElapsedMilliseconds);
    
    Run Code Online (Sandbox Code Playgroud)

    这表明2-5ms.

问题是为什么存在这种差异以及使用哪种方式.

c# asynchronous winforms task-parallel-library

1
推荐指数
1
解决办法
2668
查看次数