C# 异步 Task 创建
Task 默认使用线程池,而Thread不是
一、new Thread
1、语法
a、无参、无返回值
Task task = new Task(方法); task.Start()
b、有参、无返回值
注意:参数类型 object,在方法中做转换
Task task = new Task(方法,方法参数); // 开启 task.Start();
c、有参、有返回值
注意:这样使用返回值会 阻塞
Task<返回值类型> task = new Task<返回值类型>(方法,方法参数); // 开启 task.Start(); // 获得返回值 返回值类型 v = task.Result;
2、案例
using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace WinformThread { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // 含返回值 Task<int> task = new Task<int>(Add, 10); task.Start(); int result = task.Result; MessageBox.Show(result.ToString()); } public void MyThread(object o) { if (this.label1.InvokeRequired) { Action<string> action = (x) => { this.label1.Text = x; }; this.label1.Invoke(action, $"Hello, {o.ToString()}"); } else { this.label1.Text = $"World, {o.ToString()}"; } } private void button2_Click(object sender, EventArgs e) { // 不含返回值 Task task = new Task(MyThread, "tom"); task.Start(); } public int Add(object o) { var v = int.Parse(o.ToString()); return v + 10; } } }
二、Task.Factory.StartNew
1、语法
a、无参、无返回值
Task.Factory.StartNew(方法);
b、有参、无返回值
Task.Factory.StartNew(方法,方法参数);
c、有参、有返回值
var task = Task.Factory.StartNew(方法, 方法的参数); // 结果 var result = task.Result; MessageBox.Show(result.ToString());
注意:方法的参数类型为 object,需要在方法中进行转换,接收返回值,会发生阻塞,不需要Start
2、案例
using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace WinformThread { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // 含返回值 var task = Task.Factory.StartNew(Add, 10); var result = task.Result; MessageBox.Show(result.ToString()); } public void MyThread(object o) { if (this.label1.InvokeRequired) { Action<string> action = (x) => { this.label1.Text = x; }; this.label1.Invoke(action, $"Hello, {o.ToString()}"); } else { this.label1.Text = $"World, {o.ToString()}"; } } private void button2_Click(object sender, EventArgs e) { // 不含返回值 Task.Factory.StartNew(MyThread, "tom"); } public int Add(object o) { var v = int.Parse(o.ToString()); return v + 10; } public void Add2() { MessageBox.Show("Hi"); } } }
三、Task.Add
1、语法
a、无返回值
Task.Run(方法);
b、有返回值
var task = Task<int>.Run(方法); var result =task.Result; MessageBox.Show(result.ToString());
注意:不需要start方法,不能传参,等待返回值会阻塞
2、案例
using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace WinformThread { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // 无返回值 Task.Run(Add2); } private void button2_Click(object sender, EventArgs e) { // 不含返回值 var task = Task<int>.Run(Add3); var result =task.Result; MessageBox.Show(result.ToString()); } public void Add2() { MessageBox.Show("Hi"); } public int Add3() { return 10; } } }