2011-08-09 4 views
8

기존 API 인 RestSharp와 함께 TPL을 사용하여 구체적으로 사용할 수 있으므로 계속 사용할 수 있습니다.TPL을 기존 비동기 API와 함께 사용

그러나 이것은 내가 비동기하기 위해 고전 .NET 접근을하지 않는 API를 래핑해야하지만, 대신에 콜백을 구현하는 것을 의미한다. 다음과 같은 몇 가지 코드를 가지고 :

var client = new RestClient("service-url"); 
var request = new RestRequest(); 

client.ExecuteAsync<List<LiveTileWeatherResponse>>(request, 
    (response) => 
    { 
     ... 
    }); 

을 그래서 여기에 그것이 가능하다면 내가, TPL에 ExecuteAsync을 포장합니다. 그러나 나는 내 삶을 위해 그것을 할 수있는 방법을 찾아 낼 수 없다.

아이디어가 있으십니까?

+0

TaskCompletionSource가 RestSharp에서 작동 했습니까? –

+0

예, 그랬습니다. (이것이 내가 대답을 받아 들인 이유입니다) –

답변

12

TPL은 당신이 작업으로 거의 아무것도 표시 할 수 있습니다 TaskCompletionSource 클래스를 제공한다. SetResult 또는 SetException을 호출하면 작업을 성공 또는 실패시킬 수 있습니다. 당신이 원하는 경우 체인 작업에

var task = client.ExecuteTask<List<LiveTileWeatherResponse>>(request); 
foreach (var tile in task.Result) 
{} 

을 또는 : 당신의 예에서, 당신은 아마 같은 것을 할 수있는 :

static Task<T> ExecuteTask<T>(this RestClient client, RestRequest request) 
{ 
    var tcs = new TaskCompletionSource<T>(); 
    client.ExecuteAsync<T>(request, response => tcs.SetResult(response)); 
    return tcs.Task; 
} 

을 당신은 다음을 사용할 수 있습니다

var task = client.ExecuteTask<List<LiveTileWeatherResponse>>(request); 
task.ContinueWith(
    t => 
    { 
     foreach (var tile in t.Result) 
     {} 
    } 
); 

당신은 읽을 수 있습니다 learnin 때 TaskCompletionSource에 대한 자세한 http://blogs.msdn.com/b/pfxteam/archive/2009/06/02/9685804.aspx

+0

확실히 올바른 접근 방법입니다. 그러나 슬프게도 ContinueWith는 일찍 호출되고't.IsCompleted'는'false'로 설정됩니다 : ( –

+0

) ContinueWith에 지정된 대리자는 작업이 완료된 후에 예약되고 실행됩니다. t.IsCompleted는 델리게이트 내부에서 항상 참이어야합니다 ... 당신은 델리게이트 내부에서 그것을 틀린 것으로 본다고 하시겠습니까? –

+1

아니요, 문제는 제가'.Start()'라고 불렀던 것처럼 보입니다. WP7의 Mono 구현은 합법적이지 않다는 경고를하지 못했습니다. (.NET 4.0 콘솔 앱으로 테스트했는데 나에게 잘못이라고 말해 줬습니다.) –

1

에서 이것은 나에게 큰 고통 점이었다 g TPL도.

당신이 찾고있는 것은 TaskCompletionSource입니다. 당신이 TaskCompletionSource를 만들 때, 당신이 관련 TaskCompletionSourceSetResult 또는 SetException 메서드를 호출 할 경우에만 완료합니다 (TaskCompletionSource.Task 특성 액세스) 특수 Task 개체를 만듭니다.

이 게시물 how to wrap APM operations with the TPL 설명 (및 수신). this gist에서 TPL로 랩핑 된 APM 조작을 보여줍니다.

관련 문제