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

C#多线程入门概念及技巧_哔哩哔哩_bilibili

 

posted @ 2025-04-02 22:31  百年俊少  阅读(13)  评论(0)    收藏  举报