【发布时间】:2019-09-12 16:29:38
【问题描述】:
当我使用AsParallel() 时,下一个操作在多线程中运行,所以我在此查询中使用的方法应该是线程安全的吗?
在下一个示例中,Convert(string value) 方法不是线程安全的,但正在以AsParallel() 运行的Select() 中使用。
像标准Linq一样使用AsParallel()是否正确?
注意:Convert() 方法只是一个示例,但想象一个更复杂的方法,当它在多线程环境中执行时,它确实需要线程安全的实现。
List<string> myNamesList = new List<string>()
{
//Initialize with a lots of elements
}
List<string> myConvertedNameList = myNamesList.AsParallel()
.Where("Any Condition")
.Select(x => Convert(x))
.ToList();
public string Convert(string value)
{
int length = value.Length;
string myFantasticValueConverted = "_" + value + "["+ length +"]";
return myFantasticValueConverted;
}
【问题讨论】:
-
您发布的
Convert方法是线程安全的。 -
使用 System.Collections.Concurrent.ConcurrentBag
而不是 List -
并发和锁定是多线程编程中最难做好的事情。弄错可能会损害性能,甚至导致计算不正确。但是,当您使用并行 LINQ 查询数据集时,不要忘记执行查询的最佳位置,这一点很重要。您可以通过并行化加速应用程序中的查询,但查询发生的最佳位置可能仍然是在数据库中,这可以更快。因此,这可能会引入一种不同的方式来解决您试图解决的性能问题。
-
@oetzi - 这根本没有帮助。