适合每位开发人员的 60 个 C# 代码片段( 四 )

();Task.Run(() => {while (!data.IsCompleted){int item;if (data.TryTake(out item)){// Process item...}}});BlockingCollection<T> 提供了一种线程安全的方式来跨多个线程处理数据 。这就像为您的共享数据提供一个安全的保管库 。
用例:
实施生产者-消费者场景
在多个线程之间安全地交换数据
6. 任务延续 withContinueWithTask<int> t = Task.Run(() => 42);t.ContinueWith((antecedent) => Console.WriteLine(antecedent.Result));任务延续允许您指定任务完成后应该发生的情况 。这就像设置一排多米诺骨牌,其中一个会触发下一个 。
用例:
任务完成时执行操作
创建依赖任务链
7. 任务中的异常处理Task task = Task.Run(() => { throw new Exception("Oops!"); });try {task.Wait();} catch (AggregateException ex) {Console.WriteLine(ex.InnerExceptions[0].Message);// Prints "Oops!"}如果任务中的异常处理不正确,可能会导致整个应用程序崩溃 。通过这个技巧,您可以优雅地处理任务中的异常,就像处理一杯香槟一样 。
用例:
捕获并处理任务中抛出的异常
使您的应用程序能够适应后台任务中的错误
8. ThreadLocal<T> 的线程本地存储ThreadLocal<int> threadLocal = new ThreadLocal<int>(() => 42);Console.WriteLine(threadLocal.Value);// Prints 42ThreadLocal<T> 允许您定义每个线程唯一的数据 。这就像为每个线程提供了自己的私有存储柜 。
用例:
实现线程特定的数据以优化性能
存储不应跨线程共享的状态
9. 使用SemaphoreSlim限制并发SemaphoreSlim semaphore = new SemaphoreSlim(2);// Limit to 2 threadsTask.Run(() => {semaphore.Wait();try{// Do some work...}finally{semaphore.Release();}});信号量非常适合控制对容量有限的资源的访问 。它就像夜总会的保镖,控制可以进入的线程数量 。
用例:
限制可以访问资源的线程数量
通过限制并发防止资源耗尽
10. 跨线程同步的手动重置事件ManualResetEvent mre = new ManualResetEvent(false);Task.Run(() => {// Wait for the event to be setmre.WaitOne();// Do some work...});// Set the eventmre.Set();手动重置事件是跨多个线程同步操作的绝佳工具 。它就像比赛中的发令枪,向所有线程发出开始运行的信号 。
用例:
同步多个线程的启动时间
等待另一个线程满足某个条件
10 个集合片段1. 只读集合List<string> myList = new List<string> {"A", "B", "C"};ReadOnlyCollection<string> myReadOnlyList = myList.AsReadOnly();您可以使用 AsReadOnly 方法创建只读集合 。这可以确保集合不会被意外修改,这在处理重要数据时至关重要 。就像博物馆里的无价之宝一样,它只能看,但不能触摸!
用例:
当您想要共享集合但不希望它被修改时
防止代码中出现不必要的副作用
2. 隐式类型数组var array = new[] { "A", "B", "C" };您可以使用 new[] 关键字创建隐式类型数组 。这可以节省输入并保持代码干净简单 。这就像数组创建的洗碗机!
用例:
当你想创建一个内联数组时
当数组的类型从上下文中显而易见时
3. 队列和堆栈Queue<int> queue = new Queue<int>();queue.Enqueue(1);queue.Enqueue(2);int first = queue.Dequeue();Stack<int> stack = new Stack<int>();stack.Push(1);stack.Push(2);int last = stack.Pop();Queue 和 Stack 类提供了处理有序集合的有效方法 。队列遵循“先进先出”(FIFO) 策略,堆栈遵循“后进先出”(LIFO) 策略 。这些非常适合模拟现实世界的情况,例如售票亭的队列或一堆盘子 。
用例:
当您需要实施 FIFO 或 LIFO 策略时
模拟现实世界的情况
4. 用于快速查找的HashSetHashSet<string> hashSet = new HashSet<string> { "A", "B", "C" };bool containsA = hashSet.Contains("A");// TrueHashSet 是一个提供快速查找特定元素是否存在的集合 。它就像收藏界的 google,只是速度更快!
用例:
当需要频繁检查集合是否包含某个元素时
从集合中删除重复项
5.LINQ查询List<int> list = new List<int> { 1, 2, 3, 4, 5 };IEnumerable<int> evenNumbers = list.Where(x => x % 2 == 0);LINQ 提供了一种强大的声明性方式来查询集合 。只需一行代码,您就可以进行过滤、排序、转换等等 。这就像您的收藏有一位私人助理!
用例:


推荐阅读