誰かが私が以下のコードを変更するのを手伝ってくれませんか:
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 からのものです
あることがあります...呼び出し元のメソッドがすでに返されているため、非同期で配信された値を返すことはできません。結果が得られるまで呼び出し元をブロックすると、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>
の観点から非同期を記述することに慣れておく必要があります。
@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
コードを読むと、非同期実装の代わりにExecuteAsGet
またはExecuteAsPost
を使用したいようです。
または、単に実行するだけかもしれません-クライアントのタイプが正確にわからない。