c# - 并发集合中数组的等价物

标签 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;
}

作为示例,但现在我想在多线程环境 中执行此过程。 有没有Concurrent collection模拟多线程环境下的数组?

最佳答案

最接近的解决方案是使用将索引作为键的 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);
    });

请注意,这个特定示例根本不需要使用 ConcurrentDictionary,因为您在每次迭代之间没有依赖关系。

Parallel.For(0, ages.Length,
    i =>
    {
        if (ages[i] < 21) ages[i] = 0;
    });

此代码非常适合您的示例。下次使用更复杂的东西,比如数组元素的总和。

希望对您有所帮助!

关于c# - 并发集合中数组的等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45868851/

相关文章:

c# - 如何在 C# 中设置三种方法来接受用户输入并对输入进行数学计算?

c# - 在哪个调度程序 Task.ContinueWith() 上运行?

java - 如何确定硬件线程数

java - 在 Object.wait() 之前调用 Object.notify()

php - mysql事务中的更新——隔离

c# - 如何使用Task Parallel Library(TPL)实现重试逻辑

c# - 当其中一项任务失败时,是否有可能从 Task.WhenAll 获得成功的结果?

javascript - 触发 asp :TextBox via Javascript 的 ontextchanged() 事件

c# - 如何对任务并行性进行单元测试

c# - 生成 base-64 编码的 X509 证书对(公共(public)/私有(private)