当我使用AsParallel()
时,接下来的操作将在多线程中运行,因此,我在此查询中使用的方法应该是线程安全的吗?
在下一个示例中,方法Convert(string value)
不是线程安全的,而是在以Select()
运行的AsParallel()
中使用。
像标准AsParallel()
一样使用Linq
是否正确?
注意: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;
}
答案 0 :(得分:6)
使用AsParallel时是否需要使用线程安全的方法?
是的
答案 1 :(得分:-1)
//示例代码使用ConcurrentQueue。由于结果是并行执行的,因此需要重新排序
class Program
{
static void Main(string[] args)
{
var list = new ConcurrentBag<string>();
for (int i = 0; i <= 1000; i++)
{
list.Add(i.ToString());
}
var result = list.AsParallel().Where(q => Convert(q) < 500).Select(x => Convert(x)).ToList();
}
static int Convert(string x)
{
var i = 0;
return int.TryParse(x, out i) ? i : 0;
}
}