当控制器操作同步时,有什么理由使用async/await吗?

Mar*_*ius 2 c# asp.net asynchronous async-await

让我说我有一个控制器动作不能异步(由于各种原因),但我有一个服务(通过几种方法)调用休息服务使用HttpClient.使用异步客户端并使用.Wait或是否有任何好处.Result?或者使用同步方法的性能会降低吗?

所以要么:

//MyController.cs
public ActionResult GetSomething(int id)
{
    //lots of stuff here
    var processedResponse = _myService.Get(id);
    //lots more stuff here
    return new ContentResult(result);
}

//MyService.cs
public ProcessedResponse Get(int id)
{
    var client = new HttpClient();
    var result = client.Get(_url+id);
    return Process(result);
}
Run Code Online (Sandbox Code Playgroud)

要么:

//MyController.cs
public ActionResult GetSomething(int id)
{
    //lots of stuff here
    var processedResponse = _myService.GetAsync(id).Result;
    //or, .Wait, or Task.Run(...), or something similar
    //lots more stuff here
    return new ContentResult(result);
}

//MyService.cs
public async Task<ProcessedResponse> GetAsync(int id)
{
    var client = new HttpClient();
    var result = await client.GetAsync(_url+id);
    return await Process(result);
}
Run Code Online (Sandbox Code Playgroud)

Yuv*_*kov 5

通过使用异步客户端并将方法包装在Task.Run(()=> _myService.Get())中是否有任何好处.结果?

你最有可能获得的唯一一件事就是僵局.想想看,你在线程池线程上排队一个自然异步的方法,ASP.NET已经给你一个线程来处理你里面的Action.那没有多大意义.

如果你想要异步,并认为你实际上会从异步提供的规模中受益,那么你应该将你的控制器重新分配为异步并返回a Task<T>,你可以在那里使用await那些异步方法.

所以我要么保持同步,要么将代码从上到下重新分解以支持异步:

//MyController.cs
public async Task<ActionResult> GetSomethingAsync(int id)
{
    //lots of stuff here
    await GetAsync(id);
    return new ContentResult(result);
}

//MyService.cs
public async Task<ProcessedResponse> GetAsync(int id)
{
    var client = new HttpClient();
    var result = await client.GetAsync(_url+id);
    return await Process(result);
}
Run Code Online (Sandbox Code Playgroud)