您的位置:首页 > 编程语言

使用async和wait进行异步编程

2017-04-21 16:59 429 查看
本文来源于博客园-钱智慧,转载请注明出处

代码示例

// 要让一个方法成为异步方法:
//  - 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;
}

本文来源于博客园-钱智慧,转载请注明出处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: