![](/img/trans.png)
[英]Is this the way to change my asp.net mvc controller to call different methods using async?
[英]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
,而不使用async
和await
關鍵字。 就調用者而言,這種方法與您的方法無法區分。
所以,是的, 當你的ExecuteAsync
方法被調用時,它將像它能夠一樣異步。
GetSampleResult
本身不會執行異步,因為它沒有任何異步,但在執行結果時,它將按預期異步執行。
您的控制器方法不是async
並不重要, ExecuteAsync
方法仍將異步執行。
當請求進入時,ASP.NET接受其中一個線程池線程並將其分配給該請求。 當遇到異步部分代碼時,線程將在異步調用進行時返回到線程池。 當異步調用返回時,ASP.NET將獲取其中一個線程池線程並將其重新分配給該請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.