6

ServiceStack バージョン 3

私はhttps://github.com/ServiceStack/ServiceStack/wiki/New-APIに精通しており、このページでは、「これらのAPIにはすべて、必要なときに代わりに使用できる非同期の同等物があります」と具体的に書かれています。

ServiceStack の新しい API で async await を使用することは可能ですか?

async await を使用すると、サーバーとクライアントのコードはどのようになりますか?

[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

ドキュメントに記載されている「非同期」メソッドは Task を返さないため、そのままでは使用できませんasync/await。実際には、成功または失敗時にコールバックを呼び出す必要があります。

たとえば、署名GetAsyncは次のとおりです。

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

これは非同期関数の APM スタイルであり、TaskCompletionSource を使用して Task ベースの関数に変換できます。

    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");

Asyncを返すメソッドに追加するのが慣例であるにもかかわらず、残念ながら、明らかな理由からメソッドに GetTask という名前を付けなければなりませんでしたTask

于 2013-10-08T15:58:18.847 に答える
8

ServiceStack 4 では、GetAsync が Task を返すようになったため、期待どおりに 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 に答える