对于窗体程序,使用基于任务的异步模式需要用到Task类,下面示例下非常简单的用法。
1.创建一个拥有异步方法的类
该类拥有一个异步方法DoSomthingAsync,根据微软建议的命名规则该方法要带Async后缀
1public class Dog 2 { 3 public Task DoSomthingAsync() 4 { 5 Task task = Task.Run(() => { 6 Console.WriteLine("后台任务开始运行"); 7 Thread.Sleep(5000); 8 Console.WriteLine("后台任务运行结束"); 9 }); 10 return task; 11 } 12 }
当调用该方法的时候,就是异步执行的。为了在该方法执行完成后做进一步处理,需要写一个任务完成后的程序来做点事情,比如更新UI控件。
2.创建任务完成后需要执行的方法
1using System; 2using System.Threading; 3using System.Threading.Tasks; 4using System.Windows.Forms; 5 6namespace TaskTest 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 } 14 15 /// 16 ///任务完成后要执行的方法,更新UI 17 /// 18 private void OnDoSomthingIsComplete(Task t) { 19 Action action = () => { 20 textBox.Text = "任务完成后显示这段文字到UI控件"; 21 }; 22 textBox.Invoke(action); 23 } 24 } 25}
对于上面定义的这个OnDoSonthingIsComplete方法,我采用了类似于事件方式的命名规则。
另外,这个方法也和使用BackgroundWorker类一样,并不是在调用者线程上执行的,而是在异步线程中执行的。这就是为什么需要使用textBox.Invoke方法。
3.调用该类的异步方法
在button按下的时候调用。这里把上面所有的代码都整合在一起了。
1using System; 2using System.Threading; 3using System.Threading.Tasks; 4using System.Windows.Forms; 5 6namespace TaskTest 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 } 14 15 private void OnDoSomthingIsComplete(Task t) {//这里的参数:Task t 在下面执行的时候其实就是dog.DoSomthingAsync() 16 Action action = () => { 17 textBox.Text = "任务完成后显示这段文字到UI控件"; 18 }; 19 textBox.Invoke(action); 20 } 21 22 private void button1_Click(object sender, EventArgs e) 23 { 24 Dog dog = new Dog(); 25 Task task = dog.DoSomthingAsync().ContinueWith(OnDoSomthingIsComplete); 26 } 27 } 28 /// <summary> 29 /// Dog类 30 /// </summary> 31 public class Dog 32 { 33 public Task DoSomthingAsync() 34 { 35 Task task = Task.Run(() => { 36 Console.WriteLine("后台任务开始运行"); 37 Thread.Sleep(5000); 38 Console.WriteLine("后台任务运行结束"); 39 }); 40 return task; 41 } 42 } 43 44}
执行效果如下:

最后再说明下,对于任务执行完成后要执行处理程序,可不不用显式指定方法名,下面用lambda方式会更简练:
1private void button1_Click(object sender, EventArgs e) 2 { 3 Dog dog = new Dog(); 4 Task task = dog.DoSomthingAsync().ContinueWith((Task t)=> { 5 Action action = () => { 6 textBox.Text = "任务完成后显示这段文字到UI控件"; 7 }; 8 textBox.Invoke(action); 9 }); 10 }