Task的背后的实现也是使用了线程池线程,但它的性能优于ThreadPoll,因为它使用的不是线程池的全局队列,而是使用的本地队列,使线程之间的资源竞争减少。同时Task提供了丰富的API来管理线程、控制。但是相对前面的两种耗内存,Task依赖于CPU对于多核的CPU性能远超前两者,单核的CPU三者的性能没什么差别。
1、 创建一个task也有3种方式来操作,Task.Factory.StartNew()、Task run()、new Task(), 前面2种是一样的,不需要用start来开始执行,后面一种需要start来执行的。
Task t = Task.Run(() =>
{
Console.WriteLine(“执行异步方法”);
}
Task t = Task.Factory.StartNew( () => {
Console.WriteLine(“执行异步方法”);
} );
var task1 = new Task(() =>
{
Console.WriteLine(“Task 1 Begin”);
System.Threading.Thread.Sleep(2000);
Console.WriteLine(“Task 1 Finish”);
});
task1.Start();
2、取消任务的话,需要一个CancellationTokenSource的token来取消即可
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var task = Task.Factory.StartNew(() =>
{
for (var i = 0; i < 1000; i++)
{
System.Threading.Thread.Sleep(1000);
if (token.IsCancellationRequested)
{
Console.WriteLine(“Abort mission success!”);
return;
}
}
}, token);
tokenSource.Cancel();
3、WPF程序员处理多线程的一个方式 - Dispatcher
当我们打开一个WPF应用程序即开启了一个进程,该进程中至少包含两个线程。
一个线程Thread1用于处理呈现:隐藏在后台运行
一个线程Thread2用于管理用户界面:接收输入、处理事件、绘制屏幕以及运行应用程序代码。即UI线程
Task t = Task.Run(() =>
{
this.Dispatcher.Invoke(()=>
{
//当前lamda表达式为线程Thread2,用于管理用户界面
}
//下面执行的内容为线程Thread1,隐藏在后台运行
Console.WriteLine(“执行异步方法”);
}
4 、async/await是C#5.0中推出的
async用来修饰方法,表明这个方法是异步的,声明的方法的返回类型必须为:void,Task或Task。
await必须用来修饰Task或Task,而且只能出现在已经用async关键字修饰的异步方法中。通常情况下,async/await成对出现才有意义
static async Task GetStrLengthAsync()
{
Console.WriteLine(“GetStrLengthAsync方法开始执行”);
//此处返回的中的字符串类型,而不是Task
string str = await Task.Run(() =>
{
return “执行异步方法”;
};
Console.WriteLine(“Async方法执行结束”);
return str.Length;
}
await可以让主线程等待后台线程执行完毕再执行下一步;没有await,主线程不会等待后台线程执行完毕
如果只开了一个task,默认只有两个线程(主线程和Task开启的线程)



