没用过。。。稍后研究一下
方法一
只支持同步用法
Send();
。。。
等待Send方法执行完才继续执行后面的代码
方法二
支持同步用法
await Send();
。。。
等待Send方法执行完才继续执行后面的代码
支持异步用法
Send();
。。。
不需等待Send方法执行完就继续执行后面的代码
方法一既然是同步方法为什么要返回Task呢,这里返回Task有什么用呢。
@sky_net: 我猜第一方法里面可能是启动了一个task,这样也可以直接用task来控制同步异步
同步:
task.Wait();
异步:
task.ContinueWith(() =>
{
});
通俗点说
async和await只是告诉你这是个异步操作,但是具体的实现还是需要自己内部通过task或者其他异步方法来实现的
而task也就是第一个方法才是真正的异步实现~
历史的进程 上面是4.0的写法 下面是4.5的写法
如果你想无视区别的话 你可以把方法二当成方法一来用 没有什么问题
方法返回Task表示它可能包含一个异步操作 你可以控制这个返回的Task来等待它完成/等待返回结果
嗯 你可以回忆下beginxxx和endxxx 写法差不多
方法返回Task并且标记为async表示它可能包含一个异步操作 并且可以支持异步调用
支持异步调用是啥意思呢... 当你书写一个方法包含await的时候 .net会把这个方法编译成状态机 以Task完成回调的方式执行每个段落。如果你理解yield关键字 会发现其实是同理的=w=
考虑如下代码你会感受到区别:
async void Main() { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); Task task = send2(); task.Wait(); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); //================================ Console.WriteLine(Thread.CurrentThread.ManagedThreadId); await send2(); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); } async Task send2() { await Task.Delay(1000); }
你会惊奇的发现 执行await后 线程id变了!这就是它的区别
第一个段落表示 对于一个返回Task的async方法 你也可以用.net4.0支持的方式进行同步等待。