一、多线程:是一种并发编程技术,它允许一个应用程序同时执行多个线程。每个线程都有自己的指令集和堆栈,可以在不同的CPU核心上并行运行,或者在一个CPU核心上通过时间片轮转的方式交替运行。多线程的主要优点是可以利用多核处理器的性能,缺点是线程间的同步和通信可能会比较复杂,也可能导致数据竞争等问题。
二、异步:是一种编程范式,它允许操作同时进行而不必等待一个完成后再执行另一个。异步操作可以通过回调函数、Promise、或者语言的async/await语法来实现。异步编程的主要优点是可以提高程序的响应性,避免阻塞主线程,特别适合处理I/O密集型任务,如网络请求、文件读写等。缺点是可能导致代码逻辑复杂,也可能会出现回调地狱等问题。
异步不是多线程。异步和多线程是不同层级的概念,虽然它们在某些情况下可以相互配合实现并发编程。
异步是一种编程模型,任务执行时不会一直占用CPU,而是在遇到I/O操作或者等待其他事件时挂起,在异步操作完成后再恢复任务执行。这种模型可以提高程序的响应性和效率,特别是在处理I/O密集型任务如网络请求或文件读写时。
多线程则是另一种并发编程模型,通过使用多个线程同时执行任务,以提高程序的性能。多线程适合处理CPU密集型任务,因为它可以利用多核处理器的性能。
在某些情况下,异步和多线程可以相互配合使用,例如在异步操作中利用多线程来提高效率,或者在多线程程序中使用异步操作来避免阻塞主线程。但是它们并不能直接等同或互相替代。
.NET提供的处理和并发编程方式:
Parallel.For、Parallel.ForEach、Parallel.Invoke等方法实现并行循环和并行执行委托。System.Threading.Thread类创建和管理线程,或者使用System.Threading.ThreadPool类利用线程池资源执行并行操作。async/await关键字实现异步编程。异步方法可以在不创建新线程的情况下执行长时间运行的任务,而是通过异步IO、Task等机制实现非阻塞执行。具体实现:
1、使用List
- 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任务全部执行完成,防止阻塞