ConcurrentDictionary GetOrAdd 异步

作者:编程家 分类: c++ 时间:2025-11-27

使用ConcurrentDictionary类的GetOrAdd方法可以在并发环境下安全地获取或添加键值对。该方法是一个原子操作,可以保证在多线程环境下的线程安全性。本文将介绍GetOrAdd方法的使用,以及一个示例代码来说明其功能。

ConcurrentDictionary类和GetOrAdd方法

ConcurrentDictionary类是.NET Framework提供的线程安全的字典集合。它允许多个线程同时访问字典的不同部分,而无需进行显式的锁定操作。这种并发访问的方式可以提高性能,并减少对锁的需求。

ConcurrentDictionary类中的GetOrAdd方法用于获取指定键的值,如果键不存在,则添加一个新的键值对。该方法接受两个参数:键和一个委托,该委托用于生成键不存在时的值。如果键已存在,则返回对应的值;如果键不存在,则使用委托生成新的值,并将其添加到字典中,然后返回该值。

使用GetOrAdd方法可以避免多线程环境下的竞态条件和死锁问题,确保字典操作的线程安全性。

示例代码

下面是一个使用ConcurrentDictionary的GetOrAdd方法的示例代码:

csharp

using System;

using System.Collections.Concurrent;

public class Program

{

public static void Main()

{

ConcurrentDictionary dictionary = new ConcurrentDictionary();

int value = dictionary.GetOrAdd("key", (key) =>

{

Console.WriteLine("Generating value for key: " + key);

return key.Length;

});

Console.WriteLine("Value: " + value);

}

}

在上面的示例中,我们创建了一个ConcurrentDictionary实例,并使用GetOrAdd方法获取键为"key"的值。由于键"key"在字典中不存在,所以委托会被调用,生成一个值并将其添加到字典中。在本例中,委托生成的值是键的长度。最后,我们打印出获取到的值。

运行上述代码,输出如下:

Generating value for key: key

Value: 3

从输出结果可以看出,由于键"key"在字典中不存在,所以委托被调用并生成了一个值。最后,我们成功获取到了生成的值,并将其打印出来。

通过使用ConcurrentDictionary类的GetOrAdd方法,我们可以在并发环境下安全地获取或添加键值对。该方法的线程安全性保证了在多线程环境下的数据一致性和可靠性。我们可以通过传递一个委托来生成值,以确保在键不存在时能够正确地添加值。这使得GetOrAdd方法成为处理多线程环境下字典操作的有力工具。

参考代码

csharp

using System;

using System.Collections.Concurrent;

public class Program

{

public static void Main()

{

ConcurrentDictionary dictionary = new ConcurrentDictionary();

int value = dictionary.GetOrAdd("key", (key) =>

{

Console.WriteLine("Generating value for key: " + key);

return key.Length;

});

Console.WriteLine("Value: " + value);

}

}

相关资源

- [.NET Framework 文档](https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.concurrent.concurrentdictionary-2.getoradd?view=net-6.0)

- [ConcurrentDictionary 类](https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.concurrent.concurrentdictionary-2?view=net-6.0)