首页 新闻 会员 周边

求教异步编程async await的疑问

0
悬赏园豆:10 [待解决问题]

方法一:

public Task Send()
{
//do something
}

 

方法二:

public async Task Send()
{
await //do something
}

方法二中标记了async表示该方法是一个异步方法,必须和await配套使用。

但是在看源码的时候看到方法一的写法,返回的是Task,

请问这2种方式有什么区别吗。

sky_net的主页 sky_net | 初学一级 | 园豆:10
提问于:2016-07-12 08:29
< >
分享
所有回答(4)
0

没用过。。。稍后研究一下

夜之悲哀 | 园豆:176 (初学一级) | 2016-07-12 09:02
0

方法一

只支持同步用法

Send();

。。。

等待Send方法执行完才继续执行后面的代码

 

方法二

支持同步用法

await Send();

。。。

等待Send方法执行完才继续执行后面的代码

支持异步用法

Send();

。。。

不需等待Send方法执行完就继续执行后面的代码

keitsi | 园豆:246 (菜鸟二级) | 2016-07-12 09:37

方法一既然是同步方法为什么要返回Task呢,这里返回Task有什么用呢。

支持(0) 反对(0) sky_net | 园豆:10 (初学一级) | 2016-07-12 09:40

@sky_net: 我猜第一方法里面可能是启动了一个task,这样也可以直接用task来控制同步异步

同步:

task.Wait();

异步:

task.ContinueWith(() =>
{
});
支持(0) 反对(0) keitsi | 园豆:246 (菜鸟二级) | 2016-07-12 14:10
0

通俗点说

async和await只是告诉你这是个异步操作,但是具体的实现还是需要自己内部通过task或者其他异步方法来实现的

而task也就是第一个方法才是真正的异步实现~ 

舞动字节 | 园豆:346 (菜鸟二级) | 2016-07-12 16:07
0

历史的进程 上面是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支持的方式进行同步等待。

癫ω倒④ゞ | 园豆:262 (菜鸟二级) | 2016-07-20 09:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册