19

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

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からのものです

4

4 に答える 4

37

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

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

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

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

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

于 2012-09-02T01:14:33.413 に答える
5

@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;
    }       
}

これにより、実際にはステータス コードとすべてを含む完全なレスポンスが返されるため、コンテンツを取得する前にレスポンスのステータスが OK かどうかを確認でき、次のコマンドでコンテンツを取得できます。

response.Content
于 2014-05-27T11:53:59.953 に答える
1

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

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

于 2012-09-02T01:14:39.250 に答える