c# - 我的 Controller 方法是异步执行的吗?

标签 c# asynchronous async-await asp.net-web-api2

基于 IHttpActionResult我创建了一个基类(简化):

  public abstract class BaseHttpActionResult<T> : IHttpActionResult
  {
    protected readonly HttpRequestMessage Request;

    internal abstract Task<T> ExecuteAsync();

    protected BaseHttpActionResult(HttpRequestMessage request)
    {
      Request = request;
    }

    public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
      try
      {
        T data = await ExecuteAsync();
        return Request.CreateResponse(HttpStatusCode.OK, data);
      }
      catch (Exception ex)
      {
        HttpStatusCode statusCode;
        if (ex is UnauthorizedAccessException)
        {
          // 403
          statusCode = HttpStatusCode.Forbidden;
        }
        else if (ex is ObjectNotFoundException)
        {
          // 404
          statusCode = HttpStatusCode.NotFound;
        }
        else if (ex is DbUpdateConcurrencyException)
        {
          // 409
          statusCode = HttpStatusCode.Conflict;
        }
        else
        {
          statusCode = HttpStatusCode.InternalServerError;
        }

        return Request.CreateErrorResponse(statusCode,
                                           $"{GetType().Name} - {ex.GetType().Name}: '{ex.Message}'",
                                           ex);
      }
    }
  }

一个简单的实现可能是这样的:

  public class SampleResult : BaseHttpActionResult<string>
  {
    private readonly IDoAsyncStuffService service;

    public SampleResult(IDoAsyncStuffService service, HttpRequestMessage request) : base(request)
    {
      this.service = service;
    }

    internal override async Task<string> ExecuteAsync()
    {
      return await service.GetSomethingAsync();
    }
  }

然后是controller中的用法:

[HttpGet]
[Route(RouteConfig.Get.Sample)]
public SampleResult GetSampleResult()
{
  return new SampleResult(service, Request);
}

但是如您所见,我的 Controller 方法现在缺少 async关键字,它也只返回 SampleResult而不是 Task<SampleResult> .

所以我现在的问题是:

即使我的 Controller 方法没有这样声明并且不返回任务,所有的事情仍然是异步执行的吗?

或者我需要做一些不同的事情吗?

最佳答案

尽管看起来如此,async 是一个实现细节,而不是方法签名的一部分。它只是一种特殊的方式,让您可以编写一个返回代表正在进行的工作的Task 的函数。

在不使用 asyncawait 关键字的情况下,编写一个返回表示正在进行的工作的 Task 的方法是完全可能的。就调用者而言,这样的方法与您的方法没有区别。

所以,是的,您的 ExecuteAsync 方法被调用时,它将尽可能异步。

关于c# - 我的 Controller 方法是异步执行的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46111415/

相关文章:

c# - 制作条件循环条件?

asynchronous - Jasmine如何测试异步调用的返回值?

c# - 异步 TCP 服务器(Windows 服务)中的内存泄漏

c# - 异步任务方法 WaitingForActivation

javascript - 如何使用异步回调响应返回文件内容?

xamarin.android - .NET 4.5 PCL 中的异步/等待面向 Android 的 Mono?

c# - 从 C# 中检索程序集的 MVID?

c# - 传递对象的关联数组

c# - UWP 应用程序数据中 Json 序列化存储文​​件的最大大小

node.js - Node JS 嵌套函数被跳过