Task的使用,并介绍如何中途关闭任务
概述
ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:
◆ ThreadPool不支持线程的取消、完成、失败通知等交互性操作;
◆ ThreadPool不支持线程执行的先后次序;
Task在线程池的基础上进行了优化,并提供了更多的API。
1.async和await的使用
用async
来修饰一个方法,表明这个方法是异步的,声明的方法的返回类型必须为:void
或Task
或Task<TResult>
。
await修饰的只能是Task
或者Task<TResule>
类型,await修饰的Task/Task<TResult>
得到的是TResult。
注意它很可能会引起的死锁,处理办法是把返回值也做成异步方法,如下所示,加await修饰
private async void button1_Click(object sender, EventArgs e) { var t = Task.Run(() => { Thread.Sleep(5000); return "Hello I am TimeConsumingMethod"; }); textBox1.Text = await t; }
2.task中途取消任务
//声明CancellationTokenSource对象 static CancellationTokenSource cancelTokenSource = new CancellationTokenSource(); static void Main(string[] args) { Task.Factory.StartNew(MyTask, cancelTokenSource.Token); Console.WriteLine("请按回车键(Enter)停止"); Console.ReadLine(); cancelTokenSource.Cancel(); Console.WriteLine("已停止"); Console.ReadLine(); } //测试方法 static void MyTask() { //判断是否取消任务 while (!cancelTokenSource.IsCancellationRequested) { Console.WriteLine(DateTime.Now); Thread.Sleep(1000); } }
利用CancellationTokenSource 。
使用计时取消任务,当一个任务超过了我们所设定的时间然后自动取消该任务的执行。
var cancelTokenSource = new CancellationTokenSource(3000);
或
cancelTokenSource.CancelAfter(3000);
参考自:C# task 取消线程