//第1种:Thread类 。使用场景:快速启动执行简单任务。 //优点:简单易用。提供了直接控制线程的方法,如Start、Suspend、Resume、Abort等。 //缺点:功能较少,不适合复杂的线程管理;直接管理线程可能导致资源利用率不高或死锁等问题。 Thread thread = new Thread(() => Console.WriteLine("Hello from a new thread!")); thread.Start(); //第2种:Task并行库。使用场景:需要更好的错误处理和任务管理。 //优点:提供了丰富的API,如Task.Run、Task.WhenAll、Task.WhenAny等,易于集成和使用;支持更复杂的并发模式,如取消、超时和错误处理。 //缺点:学习曲线较陡峭,需要掌握异步编程的概念。 System.Threading.Tasks.Task.Run(() => Console.WriteLine("Task-based asynchronicity!")); //第3种:BackgroundWorker组件。使用场景:GUI应用中需要在后台执行任务,同时需要报告进度或处理异常。 //优点:支持进度更新和取消操作;自动将工作线程上的异常封送到UI线程,便于处理。 //缺点:较老的技术,可能在未来的.NET版本中逐渐淘汰;功能相对有限,不如Task并行库灵活。 var backgroundWorker = new System.ComponentModel.BackgroundWorker(); backgroundWorker.DoWork += (sender, e) => Console.WriteLine("BackgroundWorker in action!"); backgroundWorker.RunWorkerAsync(); //第4种:ThreadPool。 //场景:需要高效利用线程池资源,执行大量短时间的任务。 //优点:减少了线程创建和销毁的开销;提高了系统的响应性和吞吐量。 //缺点:控制度较低,不适合长时间运行的任务;可能因为线程池资源耗尽而导致任务等待。 ThreadPool.QueueUserWorkItem(state => Console.WriteLine("Utilizing the thread pool!")); //第5种:Timer类 //场景:需要周期性执行任务。 //优点:简单实现周期性任务;可以在指定的时间间隔后执行回调方法。 //缺点:精度受限于系统计时器;长时间运行可能会导致资源消耗过多。 var timer = new Timer(state => Console.WriteLine("Timer ticks!"),null,TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)); //第6种:async和await //场景:需要简化异步代码,提高代码的可读性和可维护性。 //优点:代码更易读易维护;简化了异步编程的复杂性。 //缺点:需要.NET 4.5或更高版本;可能会导致死锁,特别是在GUI应用中。 async System.Threading.Tasks.Task DoAsyncWork() { await System.Threading.Tasks.Task.Run(() => Console.WriteLine("Async/Await in action!")); } //第7种:Parallel类 //场景:需要对数据集合进行并行处理,以提高性能。 //优点:简化了并行代码编写。提供了丰富的并行操作API,如Parallel.For、Parallel.ForEach、Parallel.Sum等。 //缺点:可能增加线程管理开销;需要考虑数据划分和合并的问题。 int[] numbers = { 1, 2, 3, 4 }; long iResult = 0; System.Threading.Tasks.Parallel.For(0, 4, i => { iResult += i; }); //第8种:ThreadLocal //场景:需要线程安全的局部数据存储。 //优点:线程安全,避免数据竞争;提供了独立的数据副本给每个线程。 //缺点:管理不当可能导致资源泄露;需要手动清理不再需要的数据副本。 ThreadLocal<int> localValue = new ThreadLocal<int>(() => 0); localValue.Value++; // Each thread increments its own copy //第9种:Lazy //场景:需要延迟初始化对象,以节省资源或处理耗时的初始化任务。 //优点:延迟初始化,节省资源;提高了应用的启动速度。 //缺点:首次访问时可能引入延迟;需要考虑线程安全问题(尽管Lazy<T>本身是线程安全的)。 Lazy<int> lazyValue = new Lazy<int>(() => { Thread.Sleep(1000); // Simulate long initialization. return 42; }); //第10种:PLINQ //场景:对大数据集进行LINQ查询,并希望利用多核处理器提高查询效率。 //优点:利用多核处理器提高查询效率;简化了并行查询的编写。 //缺点:并行执行可能增加线程管理开销;需要考虑数据分区和聚合的策略。 var nums = System.Linq.Enumerable.Range(0, 10000).AsParallel().Where(x => x % 2 == 0).ToList();
标签:场景,Console,C#,十种,Task,线程,缺点,优点 From: https://www.cnblogs.com/apple-hu/p/18318680