gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:54:10 24 4
gpt4 key购买 nike

基于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com