As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center获取指导。




7年前关闭。





我希望这不是滥用stackoverflow;最近,我在Parallel Extensions上看到了一些很棒的问题,这引起了我的兴趣。

我的问题:
您是否正在使用并行扩展,如果使用的话,如何使用?

我叫Stephen Toub,我在Microsoft的并行计算平台团队中工作。我们是负责并行扩展的小组。我总是很想听听开发人员如何利用Parallel Extensions(例如Parallel.For,PLINQ,ConcurrentDictionary等),您拥有的积极经验,您拥有的消极经验,对未来的功能要求等等。上。
如果您愿意分享此类信息,请在此处作为对此问题的答复,或者通过stoub at microsoft dot com电子邮件私下给我。

我非常期待您的回音。

提前致谢!

最佳答案

我正在使用TPL进行嵌套的Parallel.ForEach调用。因为我从这些调用中访问字典,所以必须使用ConcurrentDictionary。虽然很好,但我有几个问题:


ForEach内部的代表没有做太多的工作,所以我没有太多的并行性。该系统似乎将大部分时间都花在了加入线程上。如果有一种方法可以弄清楚为什么并没有改善并发性,那就太好了。
内部的ForEach迭代遍历ConcurrentDictionary实例,如果我不添加枚举器缓存,则会导致系统将其大部分时间用于枚举器。
我的许多ConcurrentDictionary实例实际上都是集合,但是没有ConcurrentSet,所以我不得不用ConcurrentDictionary实现自己的实例。
ConcurrentDictionary不支持对象初始化语法,所以我不能说var dict = new ConcurrentDictionary<char, int> { { 'A', 65 } };,这也意味着我不能将ConcurrentDictionary文字分配给类成员。
在某些地方,我必须在ConcurrentDictionary中查找键并调用昂贵的函数来创建值(如果该值不存在)。如果有一个GetOrAddaddValueFactory重载,那么只有在键不存在时才可以计算该值,这将是很好的。可以使用.AddOrUpdate(key, addValueFactory, (k, v) => v)进行模拟,但是这会给每个查找增加额外的委托调用的开销。

关于.net - 您正在使用并行扩展吗? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3960269/

10-10 15:16