2016-03-08 91 views
3

这是一种涉及到下面的帖子:Why use Async/await all the way down嵌套任务<T>调用,无需异步/等待

我很好奇,在以下情况下会发生什么:

由于更新评论:

async Task FooAsync() 
{ 
    await Func1(); 
    // do other stuff 
} 

Task Func1() 
{ 
    return Func2(); 
} 

async Task Func2() 
{ 
    await tcpClient.SendAsync(); 
    // do other stuff 
} 

整个过程是否成为阻塞呼叫?或者因为Func1()实际上正在等待着,UI可以去处理其他事情?最终是否需要在Func1()上添加async/await?我玩过这个游戏,但实际上我没有注意到任何不同之处,因此,这个问题。任何见解都会很棒,谢谢!

+0

不编译,缺少Func1()中的return语句 – Guillaume

回答

3

Asyncawait只是编译器功能。

没有await调用异步方法会导致它执行同步(阻塞)的方式..

当你写await波纹管await所有代码被编译器全自动裹在Task.ContinueWith()方法,这意味着,当任务完成下面的代码在以后执行

public async Task<int> method2(){ 
    return Task.FromResult(1); 
} 

public void method1(){ 
    await method2() 
    Console.WriteLine("Done"); 
} 

将翻译是这样的:

public Task<int> method2(){ 
     return Task.FromResult(1); 
    } 

    public void method1(){ 
     method2().ContinueWith(x => { 
     Console.WriteLine("Done"); 
     }); 
    } 
+0

注意:它不像只是一个'ContinueWith',[这里是我的一个旧的答案](http://stackoverflow.com/questions/20573625/how-do-async-await-not-block/20573825#20573825)如果你想查看 –

+0

@ScottChamberlain谢谢... –

+0

如果你不使用'async-等待它没有阻止。 –

0

唯一的问题是没有制作Func1async方法而不是await ing Func2其中的任何抛出的异常都不会显示Func1

的底线是await作品上awaitablesTask/Task<T>awaitables