2017-09-01 62 views
0

以下哪一项是使用异步等待的最佳方式。异步一路向下VS异步在顶层

选项1:异步等待中的所有功能

public async Task A() 
{ 
    await B(); 
    //some code 
} 

public async Task<bool> B() 
{ 
    var result= await C(); 
    //some code 
    return result; 
} 

public Task<bool> C() 
{ 
    // not implemnted 
} 

OR

选项2:异步中仅顶层功能

public async Task A() 
    { 
     await B(); 
     //some code 
    } 

    public async Task<bool> B() 
    { 
     var result= C().Result; 
     //some code 
     return result; 

    } 

    public Task<bool> C() 
    { 
     // not implemnted 
    } 

回答

5

选项1是等待不要做正确的做法和2。如果您在callstack中的任何位置使用异步,则绝不应在代码中调用.Result.Wait()。如果你这样做,很可能你最终会使你的程序陷入僵局。

UPDATE:在一个侧面说明,如果函数B的代码不依赖于正在启动该功能(没有用户界面的工作)“最好”的方式做同一个线程这将是

public async Task A() 
{ 
    await B(); 
    //some code that interacts with the UI 
} 

public async Task<bool> B() 
{ 
    var result= await C().ConfigureAwait(false); 
    //some code does does not interact with the UI 
    return result; 
} 

public Task<bool> C() 
{ 
    // not implemnted 
} 

这使得系统可以使用任何可用的线程池线程,而不是等待同步上下文在运行延续时变为可用。

+0

编辑我的问题...在功能B我必须做一些基于结果的处理 –

+0

函数B中的代码是否以任何方式依赖于用户界面?如果没有,我更新了我的答案以显示更好的方法。 –

+0

没有。不需要UI上下文 –