簡體   English   中英

我的控制器方法是否執行異步?

[英]Are my controller methods executed async?

基於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();
    }
  }

然后在控制器中使用:

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

但是正如您所看到的,我的控制器方法現在缺少async關鍵字,並且它只返回SampleResult而不是Task<SampleResult>

所以現在我的問題是:

即使我的控制器方法沒有這樣聲明並且不返回任務,仍然所有內容都是異步執行的嗎?

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

盡管它的外觀, async是一個實現細節,而不是方法簽名的一部分。 這只是一種特殊的方法 ,您可以創建一個返回表示正在進行的工作的Task的函數。

完全可以創建一個方法,該方法返回表示正在進行的工作的Task ,而不使用asyncawait關鍵字。 就調用者而言,這種方法與您的方法無法區分。

所以,是的, 你的ExecuteAsync方法被調用時,它將像它能夠一樣異步。

GetSampleResult本身不會執行異步,因為它沒有任何異步,但在執行結果時,它將按預期異步執行。

您的控制器方法不是async並不重要, ExecuteAsync方法仍將異步執行。

當請求進入時,ASP.NET接受其中一個線程池線程並將其分配給該請求。 當遇到異步部分代碼時,線程將在異步調用進行時返回到線程池。 當異步調用返回時,ASP.NET將獲取其中一個線程池線程並將其重新分配給該請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM