一、多线程:是一种并发编程技术,它允许一个应用程序同时执行多个线程。每个线程都有自己的指令集和堆栈,可以在不同的CPU核心上并行运行,或者在一个CPU核心上通过时间片轮转的方式交替运行。多线程的主要优点是可以利用多核处理器的性能,缺点是线程间的同步和通信可能会比较复杂,也可能导致数据竞争等问题。
二、异步:是一种编程范式,它允许操作同时进行而不必等待一个完成后再执行另一个。异步操作可以通过回调函数、Promise、或者语言的async/await语法来实现。异步编程的主要优点是可以提高程序的响应性,避免阻塞主线程,特别适合处理I/O密集型任务,如网络请求、文件读写等。缺点是可能导致代码逻辑复杂,也可能会出现回调地狱等问题。
异步不是多线程。异步和多线程是不同层级的概念,虽然它们在某些情况下可以相互配合实现并发编程。
异步是一种编程模型,任务执行时不会一直占用CPU,而是在遇到I/O操作或者等待其他事件时挂起,在异步操作完成后再恢复任务执行。这种模型可以提高程序的响应性和效率,特别是在处理I/O密集型任务如网络请求或文件读写时。
多线程则是另一种并发编程模型,通过使用多个线程同时执行任务,以提高程序的性能。多线程适合处理CPU密集型任务,因为它可以利用多核处理器的性能。
在某些情况下,异步和多线程可以相互配合使用,例如在异步操作中利用多线程来提高效率,或者在多线程程序中使用异步操作来避免阻塞主线程。但是它们并不能直接等同或互相替代。
.NET提供的处理和并发编程方式:
-
Task Parallel Library (TPL):TPL是.NET Framework中的一个库,用于编写并行和并发代码。它提供了一组API和工具,可以简化并行编程的复杂性。TPL支持数据并行和任务并行,可以通过
Parallel.For
、Parallel.ForEach
、Parallel.Invoke
等方法实现并行循环和并行执行委托。 - Parallel LINQ (PLINQ):PLINQ是LINQ的并行版本,它允许在数据集合上执行并行查询操作。通过PLINQ,可以将LINQ查询转换为并行操作,从而提高性能。
- Background Worker:Background Worker是.NET中的一个组件,用于在后台线程上执行耗时的操作。它可以在不阻塞UI线程的情况下执行长时间运行的任务,适用于Windows Forms和WPF等应用程序。
-
Threads and Thread Pools:.NET还提供了对底层线程和线程池的支持。可以使用
System.Threading.Thread
类创建和管理线程,或者使用System.Threading.ThreadPool
类利用线程池资源执行并行操作。 -
Async/Await:异步编程是另一种处理并发的方式,它可以避免阻塞主线程,提高应用程序的响应性。在.NET中,可以通过异步方法和
async/await
关键字实现异步编程。异步方法可以在不创建新线程的情况下执行长时间运行的任务,而是通过异步IO、Task等机制实现非阻塞执行。 - Dataflow:Dataflow是.NET 4.5中引入的一个库,用于构建基于消息的并行和分布式应用程序。它提供了一组块(Block)类型,可以用于创建消息的生产者和消费者,并通过数据流图(Dataflow Graph)实现并行执行和消息传递。
- ** lock-free 和 wait-free 数据结构**:在.NET中,还可以使用lock-free和wait-free数据结构来实现高性能的并发编程。这些数据结构允许多个线程同时访问共享资源,而不需要使用锁或其他同步机制。
具体实现:
1、使用List<Task>文章来源:https://uudwc.com/A/rZAj6
List<Task> tasks = new List<Task>();
foreach (string model in models.Split(','))
{
string read_file_name = $"{model}-BOX-{dateTime.ToString("yyyyMMdd")}.csv";
string write_file_name = $"{model}-BOX数据生成-{dateTime.ToString("yyyyMMdd")}.csv";
tasks.Add(Task.Run(() => { ReadWriteFile(read_file_name,write_file_name); }));
}
Task.WaitAll(tasks.ToArray());//等待List里的Task任务全部执行完成,防止阻塞
文章来源地址https://uudwc.com/A/rZAj6