C#的Task异步执行任务相对于Thread多线程可以更好的利用CPU资源,更高的工作效率。适用于不需要排序的高并发作业。
可以更高效的利用硬件资源。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace 异步 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //new Task = 创建任务,不执行,需要用 .Start() 来启动任务 //Task.Factory.StartNew = 创建任务,并启动任务 //Task.Run = 把任务投递到线程池中去执行 var t1 = new Task(() => TaskMethod("Task 1")); var t2 = new Task(() => TaskMethod("Task 2")); t2.Start();//启动任务 t1.Start();//启动任务 Task.WaitAll(t1, t2);//等待指定任务执行完毕 Task.Run(() => TaskMethod("Task 3"));//抛出线程后继续向下执行,线程自己去找自己的位置执行 Task.Factory.StartNew(() => TaskMethod("Task 4"));// 创建任务,并启动任务 //标记为长时间运行任务,则任务不会使用线程池,而在单独的线程中运行,不和其他线程排队了,自己干自己的。 Task.Factory.StartNew(() => TaskMethod("Task 5"), TaskCreationOptions.LongRunning); #region 常规的使用方式 Console.WriteLine("主线程执行业务处理."); //创建任务 Task task = new Task(() => { Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作."); for (int i = 0; i < 10; i++) { Console.WriteLine(i); } }); task.Start();//启动任务,并安排到当前任务队列线程中执行任务(System.Threading.Tasks.TaskScheduler) Console.WriteLine("主线程执行其他处理"); task.Wait();//等待任务执行完毕。 #endregion } private void Form1_Load(object sender, EventArgs e) { } static void TaskMethod(string name) { Console.WriteLine("任务 {0} 在线程 {1} 上运行. 是否为线程池: {2}", name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread); } private void button2_Click(object sender, EventArgs e) { for (int i = 0; i < 1000; i++) { //Task.Run(() => TaskMethod("Task " + i.ToString()));//i++不会等待线程执行,会自顾自的一直+,所以线程中显示的数字都是 10 string t = i.ToString();//将I赋值到其他变量然后在传递给任务就显示正常的数字了 Task.Run(() => TaskMethod("Task " + t)); } } } }