【问题标题】:ServiceStack: async/await service handlersServiceStack:异步/等待服务处理程序
【发布时间】:2019-06-19 16:40:30
【问题描述】:

我已经阅读了一些涉及此问题的 SO 问题,尽管其中许多问题已有数年历史:

如何在 ServiceStack API 中编写 Service 处理程序,使其变为 async/await?

docs.servicestack.net 上根本没有提到 async/await 的文档,我只是找到了一些社区论坛帖子。我认为你唯一需要做的就是改变这个非异步方法:

public GetBookingResponse Get(GetBooking getBooking)
{
    Booking booking = _objectGetter.GetBooking(getBooking.Id);
    return new GetBookingResponse(booking);
}

对于异步方法,是这样的:

public async Task<GetBookingResponse> Get(GetBooking getBooking)
{
    Booking booking = await _objectGetter.GetBookingAsync(getBooking.Id);
    return new GetBookingResponse(booking);
}

通过这样做,异步/等待模型将通过调用堆栈神奇地被利用?

神话? =)

【问题讨论】:

  • 这里的魔力都来自GetBookingAsync()。这也应该是await 等等。
  • 是的,async await 必须贯穿始终,从头到尾,finish 是代码将其交给异步方法的地方,异步方法又将其交给操作系统。

标签: c# web-services asynchronous async-await servicestack


【解决方案1】:

是的,仅返回一个任务将使您的服务在 ServiceStack 中异步且非阻塞。

【讨论】:

  • 所以我上面的代码是正确的,返回 Task&lt;TheResponse&gt; 并使其成为 async 就足够了...
  • @Ted FYI 它只需要返回一个TaskTask&lt;T&gt; 实例(例如,也可以返回一个object 那是一个Task),如果它有@ 也没关系987654327@ 与否。所以返回方法签名无所谓,只需要返回一个Task实例即可。
  • async没关系?你愿意详细说明一下吗?听起来您没有在 .NET 中使用 async/await (TAP) 模型?
  • @Ted 返回 Task(即 C# 对未来结果的包装)使方法异步,async 关键字只是 C# 编译器语法糖,它编译状态机以在之后包装代码块await 进入任务的延续,给人一种异步是顺序代码的错觉,因此开发人员更容易读/写,但它并不比手动构造和返回 Task 值(即在 C# 之前需要什么)更异步/非阻塞有 async/await 以及 C# 编译器在幕后做了什么)。
猜你喜欢
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多