c# 的多线程实现
我用ai给写的例子
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Threading; 5 using System.Threading.Tasks; 6 using System.Collections.Concurrent; 7 8 // 使用 Lazy<T> 实现单例模式 9 public sealed class Singleton 10 { 11 private static readonly Lazy<Singleton> lazy = 12 new Lazy<Singleton>(() => new Singleton()); 13 14 public static Singleton Instance { get { return lazy.Value; } } 15 16 private Singleton() 17 { 18 // 私有构造函数,防止外部实例化 19 } 20 21 public void DoSomething() 22 { 23 Console.WriteLine("单例实例执行操作"); 24 } 25 } 26 27 class Program 28 { 29 static int sharedValue = 0; 30 31 static void Main() 32 { 33 // Parallel.For 示例 34 Console.WriteLine("Parallel.For 示例:"); 35 Parallel.For(0, 10, i => 36 { 37 Console.WriteLine($"当前线程 ID: {System.Threading.Thread.CurrentThread.ManagedThreadId}, 迭代值: {i}"); 38 }); 39 40 // Parallel.ForEach 示例 41 Console.WriteLine("\nParallel.ForEach 示例:"); 42 List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; 43 Parallel.ForEach(numbers, num => 44 { 45 Console.WriteLine($"当前线程 ID: {System.Threading.Thread.CurrentThread.ManagedThreadId}, 元素值: {num}"); 46 }); 47 48 // Parallel.Invoke 示例 49 Console.WriteLine("\nParallel.Invoke 示例:"); 50 Parallel.Invoke( 51 () => Console.WriteLine($"操作 1 在线程 {System.Threading.Thread.CurrentThread.ManagedThreadId} 上执行"), 52 () => Console.WriteLine($"操作 2 在线程 {System.Threading.Thread.CurrentThread.ManagedThreadId} 上执行"), 53 () => Console.WriteLine($"操作 3 在线程 {System.Threading.Thread.CurrentThread.ManagedThreadId} 上执行") 54 ); 55 56 // 优化后的 PLINQ 示例 57 Console.WriteLine("\n优化后的 PLINQ 示例:"); 58 int[] plinqNumbers = Enumerable.Range(1, 1000).ToArray(); 59 // 获取系统处理器核心数 60 int coreCount = Environment.ProcessorCount; 61 var optimizedPlinqResult = plinqNumbers.AsParallel() 62 .WithDegreeOfParallelism(coreCount) 63 // 过滤不必要的数据 64 .Where(n => n % 2 == 0) 65 // 合并操作 66 .Select(n => n * 2); 67 68 foreach (var result in optimizedPlinqResult) 69 { 70 Console.WriteLine(result); 71 } 72 73 // Interlocked 示例 74 Console.WriteLine("\nInterlocked 示例:"); 75 Task[] tasks = new Task[10]; 76 for (int i = 0; i < 10; i++) 77 { 78 tasks[i] = Task.Run(() => 79 { 80 for (int j = 0; j < 1000; j++) 81 { 82 Interlocked.Add(ref sharedValue, 1); 83 } 84 }); 85 } 86 87 Task.WaitAll(tasks); 88 Console.WriteLine($"Interlocked 操作后的最终结果: {sharedValue}"); 89 90 // 单例模式示例 91 Console.WriteLine("\n单例模式示例:"); 92 Singleton singletonInstance = Singleton.Instance; 93 singletonInstance.DoSomething(); 94 95 // ConcurrentBag 示例 96 Console.WriteLine("\nConcurrentBag 示例:"); 97 ConcurrentBag<int> concurrentBag = new ConcurrentBag<int>(); 98 Task[] bagTasks = new Task[10]; 99 for (int i = 0; i < 10; i++) 100 { 101 int index = i; 102 bagTasks[i] = Task.Run(() => 103 { 104 concurrentBag.Add(index); 105 Console.WriteLine($"向 ConcurrentBag 添加元素: {index}"); 106 }); 107 } 108 Task.WaitAll(bagTasks); 109 110 foreach (var item in concurrentBag) 111 { 112 Console.WriteLine($"从 ConcurrentBag 中获取元素: {item}"); 113 } 114 115 // ConcurrentStack 示例 116 Console.WriteLine("\nConcurrentStack 示例:"); 117 ConcurrentStack<int> concurrentStack = new ConcurrentStack<int>(); 118 Task[] stackTasks = new Task[10]; 119 for (int i = 0; i < 10; i++) 120 { 121 int index = i; 122 stackTasks[i] = Task.Run(() => 123 { 124 concurrentStack.Push(index); 125 Console.WriteLine($"向 ConcurrentStack 推入元素: {index}"); 126 }); 127 } 128 Task.WaitAll(stackTasks); 129 130 int result; 131 while (concurrentStack.TryPop(out result)) 132 { 133 Console.WriteLine($"从 ConcurrentStack 弹出元素: {result}"); 134 } 135 136 // ConcurrentQueue 示例 137 Console.WriteLine("\nConcurrentQueue 示例:"); 138 ConcurrentQueue<int> concurrentQueue = new ConcurrentQueue<int>(); 139 Task[] queueTasks = new Task[10]; 140 for (int i = 0; i < 10; i++) 141 { 142 int index = i; 143 queueTasks[i] = Task.Run(() => 144 { 145 concurrentQueue.Enqueue(index); 146 Console.WriteLine($"向 ConcurrentQueue 入队元素: {index}"); 147 }); 148 } 149 Task.WaitAll(queueTasks); 150 151 while (concurrentQueue.TryDequeue(out int queueResult)) 152 { 153 Console.WriteLine($"从 ConcurrentQueue 出队元素: {queueResult}"); 154 } 155 156 // ConcurrentDictionary 示例 157 Console.WriteLine("\nConcurrentDictionary 示例:"); 158 ConcurrentDictionary<int, string> concurrentDictionary = new ConcurrentDictionary<int, string>(); 159 Task[] dictTasks = new Task[10]; 160 for (int i = 0; i < 10; i++) 161 { 162 int index = i; 163 dictTasks[i] = Task.Run(() => 164 { 165 concurrentDictionary.TryAdd(index, $"Value {index}"); 166 Console.WriteLine($"向 ConcurrentDictionary 添加键值对: {index} - Value {index}"); 167 }); 168 } 169 Task.WaitAll(dictTasks); 170 171 foreach (var kvp in concurrentDictionary) 172 { 173 Console.WriteLine($"从 ConcurrentDictionary 获取键值对: {kvp.Key} - {kvp.Value}"); 174 } 175 176 // SemaphoreSlim 示例 177 Console.WriteLine("\nSemaphoreSlim 示例:"); 178 // 初始计数为 2,最大计数为 2,表示最多允许 2 个线程同时访问 179 SemaphoreSlim semaphore = new SemaphoreSlim(2, 2); 180 Task[] semaphoreTasks = new Task[5]; 181 for (int i = 0; i < 5; i++) 182 { 183 int index = i; 184 semaphoreTasks[i] = Task.Run(async () => 185 { 186 Console.WriteLine($"任务 {index} 等待进入信号量..."); 187 await semaphore.WaitAsync(); 188 try 189 { 190 Console.WriteLine($"任务 {index} 已进入信号量,正在执行..."); 191 await Task.Delay(1000); 192 } 193 finally 194 { 195 Console.WriteLine($"任务 {index} 离开信号量。"); 196 semaphore.Release(); 197 } 198 }); 199 } 200 Task.WaitAll(semaphoreTasks); 201 202 // ManualResetEventSlim 示例 203 Console.WriteLine("\nManualResetEventSlim 示例:"); 204 ManualResetEventSlim manualEvent = new ManualResetEventSlim(false); 205 Task.Run(() => 206 { 207 Console.WriteLine("工作线程开始工作..."); 208 Thread.Sleep(2000); 209 Console.WriteLine("工作线程工作完成,设置事件为有信号状态。"); 210 manualEvent.Set(); 211 }); 212 213 Console.WriteLine("主线程等待工作线程完成..."); 214 manualEvent.Wait(); 215 Console.WriteLine("主线程继续执行。"); 216 217 // ReaderWriterLockSlim 示例 218 Console.WriteLine("\nReaderWriterLockSlim 示例:"); 219 ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim(); 220 List<int> data = new List<int> { 1, 2, 3, 4, 5 }; 221 222 // 读操作任务 223 Task[] readerTasks = new Task[3]; 224 for (int i = 0; i < 3; i++) 225 { 226 int index = i; 227 readerTasks[i] = Task.Run(() => 228 { 229 rwLock.EnterReadLock(); 230 try 231 { 232 Console.WriteLine($"读者 {index} 开始读取数据: {string.Join(", ", data)}"); 233 Thread.Sleep(1000); 234 } 235 finally 236 { 237 rwLock.ExitReadLock(); 238 Console.WriteLine($"读者 {index} 读取完成。"); 239 } 240 }); 241 } 242 243 // 写操作任务 244 Task writerTask = Task.Run(() => 245 { 246 rwLock.EnterWriteLock(); 247 try 248 { 249 Console.WriteLine("写者开始写入数据..."); 250 data.Add(6); 251 Thread.Sleep(1500); 252 } 253 finally 254 { 255 rwLock.ExitWriteLock(); 256 Console.WriteLine("写者写入完成。"); 257 } 258 }); 259 260 Task.WaitAll(readerTasks.Concat(new[] { writerTask }).ToArray()); 261 } 262 }
对应的文档:
Threading 相关视频的资源分享 · BYJRK/DotNet-Discussions · Discussion #148 · GitHub

浙公网安备 33010602011771号