Jos*_*una 4 c# concurrency task-parallel-library
我在单线程环境中有以下过程:
int[] ages = { 40, 30, 18, 23, 60, 24 };
for (int i = 0; i < ages.Length; i++)
{
if (ages[i] < 21) ages[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)
作为一个例子,但现在我想在多线程环境中执行此过程。是否有并发集合在多线程环境中模拟数组?
最接近的解决方案是使用 ConcurrentDictionary 使用索引作为键。在这种情况下,哈希函数会非常有用:
var dict = new ConcurrentDictionary<int, int>(Enumerable.Range(0, ages.Length).ToDictionary(i => i, i => ages[i]));
Parallel.For(0, dict.Count,
i =>
{
int value;
if (dict.TryGetValue(i, out value) && value < 21)
dict.TryUpdate(i, value, 0);
});
Run Code Online (Sandbox Code Playgroud)
请注意,这个特定示例根本不需要使用 ConcurrentDictionary,因为每次迭代之间没有依赖关系。
Parallel.For(0, ages.Length,
i =>
{
if (ages[i] < 21) ages[i] = 0;
});
Run Code Online (Sandbox Code Playgroud)
这段代码非常适合您的示例。下次使用更复杂的东西,比如数组元素的总和。
希望这有帮助!
您可以尝试使用Parallel Linq ( PLinq ) 并让 .Net将最终结果具体化为数组;在你的情况下:
int[] ages = { 40, 30, 18, 23, 60, 24 };
ages = ages
.AsParallel()
.Select(age => age < 21 ? 0 : age)
.ToArray();
Run Code Online (Sandbox Code Playgroud)
PLinq的优势在于 .Net 负责内部集合选择、锁定等。如果您想要并行查找平均年龄,您只需稍微编辑查询即可:
var averageAge = ages
.AsParallel()
.Average();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6070 次 |
| 最近记录: |