web-dev-qa-db-ja.com

RestSharp ASYNC client.ExecuteAsync <T>()の例は機能します

誰かが私が以下のコードを変更するのを手伝ってくれませんか:

client.ExecuteAsync(request, response => {
    Console.WriteLine(response.Content);
});

基本的に、上記のExecuteAsyncメソッドを使用したいのですが、出力したくはありませんが、response.Contentを呼び出し元に返します。

これを達成する簡単な方法はありますか?

私はこれを試しましたが、機能しません:

    public T Execute<T>(RestRequest request) where T : new()
        {
            var client = new RestClient();
            client.BaseUrl = BaseUrl;
            client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey);
            request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment); // used on every request
            var response = client.ExecuteAsync(request, response => {
    return response.data);
});

}

上記のコードは https://github.com/restsharp/RestSharp からのものです

18
Nil Pun

あることがあります...呼び出し元のメソッドがすでに返されているため、非同期で配信された値を返すことはできません。結果が得られるまで呼び出し元をブロックすると、ExecuteAsyncを使用するポイントが無効になります。この場合、Task<string>を返します(response.Contentが文字列であると想定):

Task<string> GetResponseContentAsync(...)
{
  var tcs=new TaskCompletionSource<string>();
  client.ExecuteAsync(request, response => {
    tcs.SetResult(response.Content);
  });
  return tcs.Task;
}

これで、タスクが完了すると、値が得られます。 c#5 async/awaitに移行すると、かなりコアであるため、Task<T>の観点から非同期を記述することに慣れておく必要があります。

http://msdn.Microsoft.com/en-us/library/dd537609.aspx

http://msdn.Microsoft.com/en-us/library/hh191443.aspx

37
spender

@spenderの助けを借りて、これは私が得たものです:

RestSharpプロジェクトに新しいファイルを追加し、次のコードを追加できます。

public partial class RestClient
{
    public Task<IRestResponse<T>> ExecuteAsync<T>(IRestRequest request)
    {
        var tcs=new TaskCompletionSource<IRestResponse<T>>();

        this.ExecuteAsync(request, response => 
            {
                tcs.SetResult(
                    Deserialize<T>(request, response)
                );
            });

    return tcs.Task;
    }       
}

これにより、ステータスコードとすべてを含む完全な応答が実質的に返されるため、コンテンツを取得する前に応答のステータスに問題がないかどうかを確認でき、次の方法でコンテンツを取得できます。

response.Content
5
Boris

コードを読むと、非同期実装の代わりにExecuteAsGetまたはExecuteAsPostを使用したいようです。

または、単に実行するだけかもしれません-クライアントのタイプが正確にわからない。

1
Chris Shain