async:在asp.net webapi中返回任务或等待

时间:2015-04-30 10:05:52

标签: asp.net asynchronous asp.net-web-api

嗨我在webapi上有一个关于async / await的小问题。这两种用法之间是否有区别,哪一种被认为是正确的?阅读SimilarQuestion on SO之后我猜Variant 1因为开销较少而更好,但我需要确定,因此我再问一次;)

变式1:

public Task<string> Get(){
    return Bar();
}

变体2:

public async Task<string> Get(){
    return await Bar();
}

方法:

public async Task<string> Foo(){
    await Task.Delay(5000);
    return "Done";
}

public Task Bar(){
    return Foo();
}

感谢提示

1 个答案:

答案 0 :(得分:1)

变体2是不可能的,因为你无法做到

public async Task<string> Get(){
    return await Bar();
}

public Task Bar(){
    return Foo();
}

await仅适用于asyncTask Bar()不适用async ...仅适用于Task

看看Can I not await for async Task without making it async void? 它说

  

处理此问题的正确方法是等待方法,然后进行处理   调用方法异步任务。这将有一个   async的级联效果会通过您的代码传播。

话虽如此,你留下了变种1。对于大多数情况来说,这是一个不错的选择。如果您觉得异步等待会对性能产生负面影响,那么您可能会使错误的方法异步。但同样,你需要校准它。对于解决所有方法的问题,不能有一个共同的答案。

另见:

  1. the-overhead-of-asyncawait-in-net-4.5
  2. Behind the .NET 4.5 Async Scene: The performance impact of Asynchronous programming in C#