c# - .Net 4.0 中的并行功能

标签 c# .net multithreading parallel-processing

我一直在研究 .Net 4.0 中一些新的并行功能的实用性。

假设我有这样的代码:

foreach (var item in myEnumerable)
    myDatabase.Insert(item.ConvertToDatabase());

假设 myDatabase.Insert 正在执行一些操作以插入到 SQL 数据库中。

理论上你可以这样写:

Parallel.ForEach(myEnumerable, item => myDatabase.Insert(item.ConvertToDatabase()));

您会自动获得利用多核的代码。

但是如果 myEnumerable 只能由单个线程交互怎么办? Parallel 类是否会由单个线程枚举并仅将结果分派(dispatch)给循环中的工作线程?

如果 myDatabase 只能由单个线程交互怎么办?每次循环迭代都建立一个数据库连接当然不会更好。

最后,如果我的“var item”恰好是 UserControl 或必须在 UI 线程上与之交互的东西怎么办?

我应该遵循什么设计模式来解决这些问题?

在我看来,当您处理实际应用程序时,切换到 Parallel/PLinq/etc 并不容易。

最佳答案

IEnumerable<T>接口(interface)本质上不是线程安全的。 Parallel.ForEach将自动处理这个,并且只并行化枚举中的项目。 (序列将始终按顺序遍历,一次一个元素 - 但生成的对象会并行化。)

如果您的类(即:T)不能由多个线程处理,那么您不应该尝试并行化此例程。并非每个序列都是并行化的候选者——这就是为什么编译器不自动完成的原因之一 ;)

如果您正在从事需要使用 UI 线程的工作,这仍然是可能的。但是,您需要像处理后台线程上的用户界面元素时一样小心,并将数据编码回 UI 线程。在许多情况下,使用新的 TaskScheduler.FromCurrentSynchronizationContext 可以简化这一点应用程序接口(interface)。我写了关于 this scenario on my blog here .

关于c# - .Net 4.0 中的并行功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2775779/

相关文章:

c++ - JNI 使用多线程从 C++ 调用 Java

c# - 返回派生类型时为 "Interface not implemented"

c# - 在 Metro 中查找和读取任意文件数据

.net - Protocol Buffer 是否适合长期序列化?

c# - 如何确定类型是否为结构?

multithreading - 我怎样才能拥有一个等待来自多个其他人的值的 goroutine 函数?

c# - 怎么把报表的表格方向从右改到左

c# - 将包含 16 位数字的字符串拆分为 4 组

c# - 尝试反序列化 json 时无法在 JsonConvert 之后实现 Iterator 设计模式

swift - 如何更新从 array.count 获取值的标签?