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


103

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

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

답변:


202

글쎄요, Haack이 언급하는 업데이트는 제가 만든 것입니다. :) 실제로 사용하는 방법을 보여 드리겠습니다. 실제로 매우 간단합니다. 이전에는 ExecuteAsyncGet라는 RestSharp 사용자 지정 유형을 반환하는 것과 같은 메서드가있었습니다 RestRequestAsyncHandle. 이 유형은 async/await작업 Task및 Task<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.