Task多线程
1.首先是我们线程之间的启动。
1.这样
Task task = new Task(()=> { // System.Threading.Thread.Sleep(500); Console.WriteLine("do something...."); //匿名函数, //还要其他的一些东邪; }); task.Start();
2.或则这样
Task t=Task.Run(()=> { Console.WriteLine("直接我就开始run了..."); });
3.再或则这样
static void DoSomething() { System.Threading.Thread.Sleep(500); Console.WriteLine("do something..static"); } static void Main(string[] args) { Task t1 = new Task(DoSomething); t1.Start(); //这样我们就启动的落地呀; Console.WriteLine("I am main thread line"); Console.ReadLine(); }
4.这样
Task task = Task.Factory.StartNew(() => { Console.WriteLine("这样,直接使用的Task.Factory.StartNew"); });
TaskFactory tf = new TaskFactory(); Task t1 = tf.StartNew(() => { Console.WriteLine("再或则这样..."); });
总结:大概就是两种方式;构造函数和我们的factory;
1.等待任务的完成并获取返回值,这个就是我们简单的基本操作;
Task<int> task = new Task<int>(() => { int sum = 0; Console.WriteLine("fucking life..."); for (int i = 0; i < 100; i++) { sum += i; } return sum; }); task.Start(); task.Wait(); var result = task.Result.ToString(); Console.WriteLine("result is "+task.Result.ToString()); Console.WriteLine("I am main thread line"); Console.ReadLine();
2.ContinueWith方法在任务完成时启动一个新任务
Task<int> task = new Task<int>(() => { System.Threading.Thread.Sleep(600); int sum = 0; Console.WriteLine("fucking life..."); for (int i = 0; i < 100; i++) { sum += i; } return sum; }); task.Start(); Console.WriteLine("主线程,执行其他任务..."); Task hoop=task.ContinueWith(t=>{ Console.WriteLine("任务执行完之后的结果是:{0}",t.Result.ToString()); }); Console.WriteLine("I am main thread line"); Console.ReadLine();
Task 的生命周期;
var task1 = new Task(() => { Console.WriteLine("begin"); System.Threading.Thread.Sleep(2000); Console.WriteLine("finish"); }); Console.WriteLine("before start:"+task1.Status); task1.Start(); Console.WriteLine("after start:"+task1.Status); task1.Wait(); //用来主阻塞线程, Console.WriteLine("after finissh:"+task1.Status);
从我们可以得出Task的简略生命周期:
Created:表示默认初始化任务,但是“工厂创建的”实例直接跳过。
WaitingToRun: 这种状态表示等待任务调度器分配线程给任务执行。
RanToCompletion:任务执行完毕。
Task 流程的控制
var task1 = new Task(() => { Console.WriteLine("task 1 begin"); System.Threading.Thread.Sleep(2000); Console.WriteLine("task 1 finished"); }); var task2 = new Task(() => { Console.WriteLine("task 2 begin"); System.Threading.Thread.Sleep(2000); Console.WriteLine("task 2 finished"); }); var task3 = new Task(() => { Console.WriteLine("task 3 begin"); System.Threading.Thread.Sleep(2000); Console.WriteLine("task 3 finished"); }); task1.Start(); task2.Start(); task3.Start(); Task.WaitAll(task1, task2, task3); //他它接受数组类型的task的使用地呀; Console.WriteLine("All task has finished"); Console.ReadLine();
Ps: Task.WaitAny
这个用发同Task.WaitAll,就是等待任何一个任务完成就继续向下执行,将上面的代码WaitAll替换为WaitAny,输出结果如下:
ContinueWith的用法。
var task1 = new Task(() => { Console.WriteLine("task 1 begin"); System.Threading.Thread.Sleep(500); Console.WriteLine("task 1 finished"); }); task1.Start(); var result = task1.ContinueWith<string>(t=> { Console.WriteLine("task1 finished "); return "continue task finish....."; });
//在每次调用ContinueWith方法时,每次会把上次Task的引用传入进来,以便检测上次Task的状态, var send = Task.Factory.StartNew(() => { Console.WriteLine("fuck life.."); }) .ContinueWith<bool>(s => { if (1 == 1) return false; }) .ContinueWith<string>(r => { if (r.Result) { return "Finished"; //可以获取上一个流程task 中的值 } else { return "Error"; } }); Console.WriteLine(send.Result);
Task的取消
var tokenSource = new CancellationTokenSource(); var token = tokenSource.Token; Console.WriteLine(token.ToString()); var task = Task.Factory.StartNew(() => { for (var i = 0; i < 1000; i++) { System.Threading.Thread.Sleep(1000); Console.WriteLine("proceeed mission..."); if (token.IsCancellationRequested) { Console.WriteLine("Abort mssion sucess!"); //这里也采用轮循的方式.... return; } } },token); token.Register(() => { Console.WriteLine("Cancle task...."); }); Console.WriteLine("press enter to cancle task..."); Console.ReadKey(); tokenSource.Cancel(); Console.ReadLine();
这里还有一篇较好的文章:http://www.cnblogs.com/jesse2013/p/async-and-await.html