6

服务堆栈版本 3

我对https://github.com/ServiceStack/ServiceStack/wiki/New-API非常熟悉,在此页面上它特别指出“所有这些 API 都有异步等效项,您可以在需要时使用它们。”

是否可以将 async await 与 ServiceStack 的新 api 一起使用?

使用异步等待,服务器和客户端代码会是什么样子?

[Route("/reqstars")]
public class AllReqstars : IReturn<List<Reqstar>> { }

public class ReqstarsService : Service
{
    public List<Reqstar> Any(AllReqstars request) 
    {
        return Db.Select<Reqstar>();
    }
}

客户

var client = new JsonServiceClient(BaseUri);
List<Reqstar> response = client.Get(new AllReqstars());

有人可以将这些同步示例转换为异步吗?

4

2 回答 2

11

文档中提到的“异步”方法不返回任务,因此它们不能按async/await原样使用。它们实际上需要回调来调用成功或失败。

例如,签名为GetAsync

public virtual void GetAsync<TResponse>(string relativeOrAbsoluteUrl, 
    Action<TResponse> onSuccess, 
    Action<TResponse, Exception> onError)

这是异步函数的 APM 样式,可以使用 TaskCompletionSource 转换为基于任务的函数,例如:

    public static Task<TResponse> GetTask<TResponse>(this JsonServiceClient client, string url)
    {
        var tcs = new TaskCompletionSource<TResponse>();

        client.GetAsync<TResponse>(url,
            response=>tcs.SetResult(response),
            (response,exc)=>tcs.SetException(exc)
            );

        return tcs.Task;
    }

您可以像这样调用扩展方法:

var result = await client.GetTask<SomeClass>("someurl");

不幸的是,出于显而易见的原因,我不得不将方法命名为 GetTask,即使约定是附加Async到返回的方法Task

于 2013-10-08T15:58:18.847 回答
8

使用 ServiceStack 4,GetAsync 现在返回一个任务,因此可以按预期简单地使用 await:

var client = new JsonServiceClient(BaseUri);
var response = await client.GetAsync(new AllReqstars());

此处的文档: https ://github.com/ServiceStack/ServiceStack/wiki/C%23-client#using-the-new-api

注意:据我所知,ServiceStack v4 与 v3.x 相比有许多重大变化,并且已经摆脱了 BSD 许可,并对其免费层的使用限制:https ://servicestack.net/pricing ,因此可能不会升级到 4一个选项。

于 2014-01-15T02:49:25.523 回答