本文来源于博客园,转载请注明出处
代码示例
// 要让一个方法成为异步方法:
// - async修饰符.
// - 返回类型是 Task 或者 Task<T>. 具体来说,如果函数没有return具体的值,则返回类型是Task,否则是Task<T>
// 这里 AccessTheWebAsync返回了整数,所以它的返回类型是Task<int>
// - 方法名后缀 "Async",显然这是一个约定
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
// GetStringAsync 返回Task<string>. 这意味着如果你await该task,你将获利一个string
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// 这里可以做一些不依赖getStringTask返回值的工作
DoIndependentWork();
// await会挂起AccessTheWebAsync的执行线程,getStringTask执行完毕,AccessTheWebAsync 才能继续执行
string urlContents = await getStringTask;
// 等待 AccessTheWebAsync 的方法会获取一个长度值
return urlContents.Length;
}
这段代码来自MSDN,可以看到作为异步方法的AccessTheWebAsync也调用了异步方法GetStringAsync。
另外要注意:对异步的方法await调用只能在异步方法中,比如下边的代码在编译期间就会报错
class Program
{
static void Main(string[] args)
{
var t = AccessTheWebAsync();
string ret=await t;
}
async static Task<string> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
string urlContents = await getStringTask;
System.Console.WriteLine("Caller done");
return urlContents;
}
}
正确的调用方式如下
static void Main(string[] args)
{
var t = AccessTheWebAsync();
t.Wait();
string r=t.Result;
}
本文来源于博客园,转载请注明出处