static string Greeting(string name)
{
Task.Delay(3000).Wait();
return $"Hello,{name}";
}
static Task<string> GreetAsync(string name)
{
return Task.Run<string>(() =>
{
return Greeting(name);
});
}
async static void CallerWithAsync()
{
Console.WriteLine("1");
string result = await GreetAsync("倪司令");
Console.WriteLine("2");
Console.WriteLine(result);
}
定义方法GreetingAsync,可以使方法异步化。基于任务的异步模式指定,在异步方法名后加上Async后缀,并返回一个任务。异步方法GreetingAsync和同步方法Greeting具有相同的输入参数,但是它返回的是 Task。Task定义了一个返回字符串的任务。一个比较简单的做法是用Task.Run方法返回一个任务。泛型版本的Task.RunO)创建一个返回字符串的任务:
可以使用await关键字来调用返回任务的异步方法 GreetingAsync。使用 await关键字需要有用async修饰符声明的方法。在GreetingAsync方法完成前,该方法内的其他代码不会继续执行。但是,启动CallerWithAsync方法的线程可以被重用。该线程没有阻塞:
如果异步方法的结果不传递给变量,也可以直接在参数中使用await关键字。在这里,GreetingAsync方法返回的结果将像前面的代码片段一样等待,但是这一次的结果会直接传给WriteLine方法:
static void CallerWithContinuationTask()
{
Task<string> t1 = GreetAsync("阿斯顿马丁");
t1.ContinueWith(t =>
{
Console.WriteLine(t.Result);
});
}
GreetingAsync方法返回一个Task对象。该Task对象包含任务创建的信息,并保存到任务完成。Task类的 ContinueWith方法定义了任务完成后就调用的代码。指派给 ContinueWith方法的委托接收将已完成的任务作为参数传入,使用Result属性可以访问任务返回的结果:编译器把await关键字后的所有代码放进ContinueWith方法的代码块中来转换await关键字。