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));
}
}
}
}
万捷博客