文中所有Task<TResult>的返回值都是直接用task.result获取,这样如果后台任务没有执行完毕的话,主线程会等待其执行完毕,这样的话就和同步一样了(看上去一样,但其实await的时候并不会造成线程的阻塞,web程序感觉不到,但是wpf,winform这样的桌面程序若不使用异步,会造成UI线程的阻塞)。简单演示一下Task回调函数的使用:
Console.WriteLine("主线程开始"); Task<string> task = Task<string>.Run(() => { Thread.Sleep(2000); return Thread.CurrentThread.ManagedThreadId.ToString(); }); //会等到任务执行完之后执行 task.GetAwaiter().OnCompleted(() => { Console.WriteLine(task.Result); }); Console.WriteLine("主线程结束"); Console.Read();
结果:
OnCompleted中的代码会在任务执行完成之后执行!
另外task.ContinueWith()也是一个重要的方法:
Console.WriteLine("主线程开始"); Task<string> task = Task<string>.Run(() => { Thread.Sleep(2000); return Thread.CurrentThread.ManagedThreadId.ToString(); }); task.GetAwaiter().OnCompleted(() => { Console.WriteLine(task.Result); }); task.ContinueWith(m=>{Console.WriteLine("第一个任务结束啦!我是第二个任务");}); Console.WriteLine("主线程结束"); Console.Read();
结果:
ContinueWith()方法可以让该后台线程继续执行新的任务。