RestSharpをasync / awaitで使用する方法


103

私はRestSharpを使用して、いくつかの非同期C#コードの近代的な例を見つけるのに苦労してるasyncとはawait。私はあります知っているハークによる最近更新されて、私は新しいメソッドを使用する方法がわかりません。

また、操作をキャンセルできるようにキャンセルトークンを提供するにはどうすればよいですか(たとえば、人が待っていることにうんざりしていて、アプリのUIの[キャンセル]ボタンを押した場合)。

回答:


202

ええと、Haackが参照している更新は私が行ったものです:)だから、実際には非常に簡単なので、その使用方法を紹介しましょう。以前はExecuteAsyncGet、という名前のRestSharpカスタムタイプを返すようなメソッドがありましたRestRequestAsyncHandle。この型は、戻り値の型でasync/await機能するためTask、待つことができませんでしたTask<T>。私のプルリクエストは、Task<T>インスタンスを返す既存の非同期メソッドにオーバーロードを追加しました。これらのTask<T>オーバーロードには、名前に「タスク」文字列が追加されています。たとえば、のTask<T>オーバーロードExecuteAsyncGetはと呼ばれExecuteGetTaskAsync<T>ます。新しいTask<T>オーバーロードごとに、a CancellationTokenを指定する必要のないメソッドが1つあります。

それでは、それを使用する方法の実際の例に進みますCancellationToken

private static async void Main()
{
    var client = new RestClient();
    var request = new RestRequest("http://www.google.com");
    var cancellationTokenSource = new CancellationTokenSource();

    var restResponse = 
        await client.ExecuteTaskAsync(request, cancellationTokenSource.Token);

    // Will output the HTML contents of the requested page
    Console.WriteLine(restResponse.Content); 
}

これExecuteTaskAsyncは、Task<IRestResponse>インスタンスを返すオーバーロードを使用します。が返されるTaskので、awaitこのメソッドでキーワードを使用して、Task<T>返されたタイプ(この場合IRestResponse)を返すことができます。

ここでコードを見つけることができます:http : //dotnetfiddle.net/tDtKbL


ああ!私は思う:heart:あなた!! (そして、それがバレンタインデーであることを考えると、非常に適切です)。これは、RestSharp wikiに追加すると非常に便利です。わかりましたので、このPCLがある可能性もあります。または私は自分の運を押し上げていますか?
Pure.Krome

これのPCLバージョンが機能するかどうかはわかりませんが、今後検討する予定です。そして、私はそれを編集することが許可されているかどうかわからない(私はライブラリの定期的なメンテナーではありません)wikiに追加するのは良いことだと思います。
Erik Schierboom 2014

たぶん、Twitterで@Haackedを会話に入れることができるでしょうか?
Pure.Krome

3
カスタムIRestResponse実装にマップするにはどうすればよいですか?
jpgrassi 2015年

2
私が最後にRestsharpを使用したのは、ショルダーパッドが流行したのと同じ頃だったので、回転式の電話が当たり前であり、私たち全員がRobotics 14.4kモデムを介してお気に入りのBBSにアクセスするのが大好きでした。回答承認の緑のカチカチ、私はします。
Pure.Krome 2017年

3

私の場合、正しく機能するためにTask.Wait()を呼び出す必要がありました。ただし、CancellationTokenSourceをパラメーターとして使用しないバージョンを使用しました。

private static async void Main()
{
    var client = new RestClient();
    var request = new RestRequest("http://www.google.com");
    Task<IRestResponse> t = client.ExecuteTaskAsync(request);
    t.Wait();
    var restResponse = await t;
    Console.WriteLine(restResponse.Content); // Will output the HTML contents of the requested page
}

9
Wait非同期コードを利用せずに使用することで、同期的に実行するだけです。
マフィンマン

私の場合、(キャンセルトークンの有無にかかわらず)ExecuteTaskAsynkを呼び出しても、IISが応答しなくなります。原因が見つかるまで、このHACKを使用する必要がありました。
アレックス75

なぜ待つだけなのか、同期バージョンの通話を使用しないでください...無意味
Egli Becerra

1
他の場所で使用するためにスレッドを解放していませんか?もう一方の側で長時間実行する操作は有益ですよね?
benmccallum 2018

はい、出力が来ました、答えが有効かどうか、非同期操作を達成していますか?
Prince Antony G
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.