最近在学习.net4.5推出的基于任务的异步模式的学习,记录部分笔记以便日后回顾:
上代码:
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp5
{
class Program
{
static void Main(string[] args)
{
Print();
Console.WriteLine("返回主线程");
Thread.Sleep(150200);//这段代码是必须的,模拟前台线程一直在工作因为异步开启的是后台线程,如果main的主线程退出,后台线程会自动退出
}
public static async void Print()//供调用方调用的异步方法:
{
Console.WriteLine(" print begin");
string s = await OutPut();
Console.WriteLine("呵呵");
await DoSomeThing();
Console.WriteLine(s);
}
public static Task<string> OutPut()//任务方法(带有返回值)
{
Task<string> task = new Task<string>(() => { Thread.Sleep(5000);Console.WriteLine("Output OK"); return "simon"; });
task.Start();
return task;
}
public static Task DoSomeThing()//任务方法(不带返回值)
{
var task= new Task(() => { Thread.Sleep(3000); Console.WriteLine("DoSomeThing OK"); });
task.Start();
return task;
}
//要点:
//异步方法是指可通过await关键字将线程的控制权还给调用方从而实现调用方不被阻塞而任务方法也可以同时执行的方法,由此实现异步,可以认为是在调用方和任务方法直接加的一个具有异步能力中间层。
//这里涉及到三个角色方法:异步方法调用方;带有async/await的异步方法;异步方法内await后跟的返回Task的任务方法
//三个方法内部都是同步执行的,例如上的Print方法内部一定是同步执行,只是通过await实现调用方Main的异步(以前一直以为异步方法是其本身可以异步)
}
}