基于 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
的函数。
在不使用 async
和 await
关键字的情况下,编写一个返回表示正在进行的工作的 Task
的方法是完全可能的。就调用者而言,这样的方法与您的方法没有区别。
所以,是的,当您的 ExecuteAsync
方法被调用时,它将尽可能异步。
关于c# - 我的 Controller 方法是异步执行的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46111415/