异步服务库 https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.ServiceInterface/AsyncServiceBase.cs#L17已被弃用为异步执行 https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.ServiceInterface/ServiceBase.cs#L307现在位于 ServiceBase 中,当发出请求时会调用它/asynconeway/XXX预定义的端点。
而不是压倒一切异步执行建议的方法是实施消息工厂 https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.Interfaces/Messaging/IMessageFactory.cs如果一个IMessageFactory
已在AppHost IOC中注册。如果 IMessageFactory 没有注册,那么它只会执行 Sync - 此时如果您仍然希望它是非阻塞的,您可以覆盖它。 ExecuteAsync 的实现位于:
// Persists the request into the registered message queue if configured,
// otherwise calls Execute() to handle the request immediately.
//
// IAsyncService.ExecuteAsync() will be used instead of IService.Execute() for
// EndpointAttributes.AsyncOneWay requests
public virtual object ExecuteAsync(TRequest request)
{
if (MessageFactory == null)
{
return Execute(request);
}
BeforeEachRequest(request);
//Capture and persist this async request on this Services 'In Queue'
//for execution after this request has been completed
using (var producer = MessageFactory.CreateMessageProducer()) {
producer.Publish(request);
}
return ServiceUtils.CreateResponseDto(request);
}
IMessageFactory(客户端)/IMessageService(服务器)是 ServiceStack 消息传递 API 的一部分,它允许您发布消息以便稍后延迟执行。请参阅Redis 和消息传递 wiki https://github.com/ServiceStack/ServiceStack/wiki/Messaging-and-redis有关使用内置 Redis IMessageService 的端到端解决方案的示例。还有InMemory https://github.com/ServiceStack/ServiceStack/blob/master/tests/ServiceStack.Messaging.Tests/TransientServiceMessagingTests.cs and RCon https://github.com/ServiceStack/ServiceStack/tree/master/src/ServiceStack.Common/Messaging/RconIMesssageService 已可用,并且您也可以轻松创建自己的 IMesssageService。
未来的异步支持
还有一个异步分支 https://github.com/ServiceStack/ServiceStack/tree/async运行 ServiceStack 的IHttpAsyncHandler
并且已经有一个功能性的 alpha 版本可供您尝试:ServiceStack-v4.00-alpha.zip https://github.com/downloads/ServiceStack/ServiceStack/ServiceStack-v4.00-alpha.zip
通过此更改,ServiceStack 支持Task<>
作为服务的返回类型。您只需注册任务插件 https://github.com/ServiceStack/ServiceStack/blob/async/tests/ServiceStack.Plugins.Tasks.Tests/TaskServiceTest.cs#L46。要查看完整的示例,请查看本次集成测试 https://github.com/ServiceStack/ServiceStack/blob/async/tests/ServiceStack.Plugins.Tasks.Tests/TaskServiceTest.cs.