web-dev-qa-db-ja.com

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

asyncawaitを指定してRestSharpを使用する非同期C#コードの最新の例を見つけるのに苦労しています。 Haackによる最近の更新である があることは知っていますが、新しいメソッドの使用方法はわかりません。

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

88
Pure.Krome

さて、Haackが参照している更新は私によって行われたものです:)実際には非常に単純なので、使用方法を説明しましょう。以前は、ExecuteAsyncGetという名前のRestSharpカスタムタイプを返すRestRequestAsyncHandleなどのメソッドがありました。 async/awaitTaskおよびTask<T>戻り値の型で機能するため、この型は待ち切れませんでした。私のpull-requestは、Task<T>インスタンスを返す既存の非同期メソッドにオーバーロードを追加しました。これらのTask<T>オーバーロードには、名前に追加された「タスク」文字列が追加されています。たとえば、ExecuteAsyncGetTask<T>オーバーロードはExecuteGetTaskAsync<T>と呼ばれます。新しいTask<T>オーバーロードごとに、CancellationTokenを指定する必要のないメソッドと、必要なメソッドがあります。

それでは、実際の使用方法の例に移りましょう。これは、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); 
}

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

コードは次の場所にあります。 http://dotnetfiddle.net/tDtKbL

177
Erik Schierboom

私の場合、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
}
2
Ram Jayaraman