async / await와 함께 RestSharp를 사용하는 방법


103

및와 함께 RestSharp를 사용하는 비동기 C # 코드의 최신 예제를 찾기 위해 고군분투 async하고 await있습니다. 나는이 것을 알고 Haack의 최근 갱신하고 있지만 새로운 방법을 사용하는 방법을 모르겠어요.

또한 작업을 취소 할 수 있도록 취소 토큰을 제공하려면 어떻게해야합니까 (예 : 사람이 기다리는 데 지쳐서 앱 UI에서 취소 버튼을 누르는 경우).

답변:


202

글쎄요, Haack이 언급하는 업데이트는 제가 만든 것입니다. :) 실제로 사용하는 방법을 보여 드리겠습니다. 실제로 매우 간단합니다. 이전에는 ExecuteAsyncGet라는 RestSharp 사용자 지정 유형을 반환하는 것과 같은 메서드가있었습니다 RestRequestAsyncHandle. 이 유형은 async/await작업 TaskTask<T>반환 유형 으로 기다릴 수 없습니다 . 내 풀 요청은 Task<T>인스턴스 를 반환하는 기존 비동기 메서드에 오버로드를 추가했습니다 . 이러한 Task<T>오버로드에는 이름에 추가 된 "작업"문자열 이 있습니다. 예를 들어에 대한 Task<T>오버로드 ExecuteAsyncGet는라고 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); 
}

인스턴스 ExecuteTaskAsync를 반환하는 오버로드를 사용합니다 Task<IRestResponse>. 를 반환 하므로이 메서드에 키워드를 Task사용하고 의 반환 된 유형 (이 경우 )을 반환 할 수 있습니다 .awaitTask<T>IRestResponse

코드는 여기에서 찾을 수 있습니다. http://dotnetfiddle.net/tDtKbL


아! 내 생각 : 심장 : 당신 !! (그리고 그것이 발렌타인 데이라는 것을 고려할 때 매우 적합합니다). RestSharp 위키에 추가하면 아주 좋을 것입니다. 좋아, 그래서 .. 이것의 PCL도있을 가능성이 있는가? 아니면 내 행운을 밀고 있는가?
Pure.Krome 2014

이것의 PCL 버전이 작동할지 확실하지 않지만 나중에 조사 할 것입니다. 그리고 저는 위키에 추가하는 것이 좋을 것이라는 데 동의합니다. 편집 할 수 있는지 모르겠습니다 (저는 라이브러리의 정규 관리자가 아닙니다).
Erik Schierboom 2014

@Haacked를 대화에 참여시킬 수 있을까요? Twitter 에서요?
Pure.Krome 2014

3
사용자 지정 IRestResponse 구현에 매핑하려면 어떻게해야합니까?
jpgrassi

2
어깨 패드가 유행하는시기에 Restsharp를 마지막으로 사용했기 때문에 회전식 전화기가 표준이었고 우리 모두는 Robotics 14.4k 모뎀을 통해 좋아하는 BBS를 사용하는 것을 좋아했습니다. 답변 승인의 녹색 체크 표시합니다.
Pure.Krome

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가 응답하지 않게됩니다. 원인을 찾을 때까지이 해킹을 사용해야했습니다.
Alex 75

그나마 방금 전화 ... 무의미의 동기 버전을 사용하는 이유 기다려야하는 경우
Egli 베 세라

1
그래도 쓰레드를 다른 곳에서 사용할 수있게 해주지 않습니까? 다른 쪽 끝에있는 장기 실행 작업에서는 유익하지 않습니까?
benmccallum

예, 출력이 왔으며 대답이 유효한지 여부, 비동기 작업을 수행하고 있습니까?
Prince Antony G
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.