调用同步方法的异步方法

时间:2016-05-14 06:39:25

标签: async-await asp.net-web-api2

Async的新手,并尝试了解何时使用它。 我们将在webapi2中调用遗留Web服务有很多方法。

我们有很多低级别的dll(Company.Dal.dll,Company.Biz.dll)等。它们的方法不是非同步的

问题 async必须一直是真的吗? 有一个高级别的dll(所有方法异步)调用低级别的dll(dal,biz等传统代码),其中没有一个方法是异步的吗?

让高级组件异步同步和其他同步是否有任何好处?

enter image description here

非常感谢您的澄清 任何解释这个概念的好教程

2 个答案:

答案 0 :(得分:1)

如果您确实async某事,那么使用await才有意义。如果你不这样做,async方法实际上将是完全同步的(并且你会从编译器收到关于它的警告)。

在这种情况下,async没有任何优势,只有缺点:代码更复杂,效率更低。

答案 1 :(得分:0)

线程一次只能做一件事。如果程序使你的线程忙,那就没有意义使它们异步。

但是,如果有一段时间你的程序中的线程必须等待其他东西完成,那么你的线程可能会做一些有用的事情。在那些情况下,async-await变得有用。

Eric lippert once explained async-await with a restaurant metaphor(在页面上搜索async-await)。如果你有一个厨师必须要等到烤面包,这个厨师可以做其他的事情,比如做一个鸡蛋,当“其他东西”完成后回到烤面包机,或者什么时候等待什么,就像等待煮熟的鸡蛋一样。

在软件中,除了等待完成任务之外,线程通常什么都不做的事情是读取/写入磁盘,通过网络发送或接收数据等。这些通常是您可以找到异步版本的操作以及该过程的非异步版本。例如,请参阅Stream,TextReader,WebClient等类。

如果你的线程必须进行大量的计算,那么使函数异步是没有用的,因为没有时刻你的线程不会做任何事情而是等待,所以你的线程没有时间做其他事情

但是,如果您的线程在计算完成时可以做一些有用的事情,那么考虑让另一个线程在您的线程执行其他有用的东西时进行这些计算:

private async Task<int> MyLengthyProcedure(...)
{
    Task<int> calculationTask = Task.Run( () => DoCalculations(...));
    // while one of the threads is doing the calculations,
    // your thread could do other useful things:
    int i = DoOtherCalculations();

    // or if there are calculations that could be performed
    // by separate threads simultaneously, start a second task
    Task<int> otherCalculationTask = Task.Run( () => DoEvenMoreCalculations(...));

    // now two threads are doing calculations. This thread is still free to
    // do other things

    // after a while you need the result of both calculations:
    await Task.WhenAll( new Task[] {calculationTask, otherCalculationTask});

    // the int return value of DoCalculations and DoOtherCalculations are in
    // the Result property of the task object:
    int j = calculationTask.Result;
    int k = otherCalculationTask.Result;
    return i + j + k;
;