在C#中,Dictionary是一个常见的字典类型,但它不是线程安全的。为了在多线程环境中确保安全的操作,我们可以使用ConcurrentDictionary,这是一个专门设计用于多线程场景的线程安全字典。
首先,我们来看一个使用普通的Dictionary的例子。在这个例子中,我们创建一个Dictionary对象,然后通过多个线程同时进行读取和写入操作,以演示潜在的线程安全问题。
using System;using System.Collections.Generic;using System.Threading;using System.Threading.Tasks;class Program{ static void Main() { // 创建一个非线程安全的 Dictionary Dictionary<int, string> regularDictionary = new Dictionary<int, string>(); // 启动多个线程对字典进行读取和写入操作 List<Task> tasks = new List<Task>(); for (int i = 0; i < 10; i++) { int key = i; tasks.Add(Task.Run(() => { // 读取和写入操作 RegularDictionaryExample(regularDictionary, key); })); } // 等待所有任务完成 Task.WaitAll(tasks.ToArray()); Console.WriteLine("Regular Dictionary:"); PrintDictionary(regularDictionary); Console.ReadLine(); } // 非线程安全的字典操作示例 static void RegularDictionaryExample(Dictionary<int, string> dictionary, int key) { if (dictionary.ContainsKey(key)) { Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}: Key {key} already exists. Value: {dictionary[key]}"); } else { dictionary[key] = $"Value from Thread {Thread.CurrentThread.ManagedThreadId}"; Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}: Key {key} added."); } } // 打印字典内容 static void PrintDictionary<T, U>(Dictionary<T, U> dictionary) { foreach (var kvp in dictionary) { Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}"); } }}
接下来,我们使用ConcurrentDictionary来解决线程安全问题。ConcurrentDictionary提供了内置的线程安全机制,避免了多线程同时访问时的问题。
using System;using System.Collections.Concurrent;using System.Threading;using System.Threading.Tasks;class Program{ static void Main() { // 创建一个线程安全的 ConcurrentDictionary ConcurrentDictionary<int, string> concurrentDictionary = new ConcurrentDictionary<int, string>(); // 启动多个线程对字典进行读取和写入操作 List<Task> tasks = new List<Task>(); for (int i = 0; i < 10; i++) { int key = i; tasks.Add(Task.Run(() => { // 读取和写入操作 ConcurrentDictionaryExample(concurrentDictionary, key); })); } // 等待所有任务完成 Task.WaitAll(tasks.ToArray()); Console.WriteLine("/nConcurrent Dictionary:"); PrintDictionary(concurrentDictionary); Console.ReadLine(); } // 线程安全的字典操作示例 static void ConcurrentDictionaryExample(ConcurrentDictionary<int, string> dictionary, int key) { string value = dictionary.GetOrAdd(key, k => $"Value from Thread {Thread.CurrentThread.ManagedThreadId}"); Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}: Key {key} {((value == null) ? "added" : "already exists")}. Value: {value}"); } // 打印字典内容 static void PrintDictionary<T, U>(ConcurrentDictionary<T, U> dictionary) { foreach (var kvp in dictionary) { Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}"); } }}
通过选择适当的字典类型,可以确保在多线程应用程序中有效地管理数据,避免潜在的线程安全问题。
本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-81061-0.htmlC#中Dictionary与ConcurrentDictionary解锁多线程操作安全之道
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: Golang VS PHP哪个更适合你?
下一篇: 强大的代码编辑器组件,你知道几个?