Использование TPL с существующими асинхронными API - PullRequest
8 голосов
/ 09 августа 2011

Я хочу использовать TPL с существующим API, в частности RestSharp, чтобы я мог использовать продолжения.

Но это означает, что мне нужно обернуть API, который не использует классический подход .NET кasync, но вместо этого реализует обратные вызовы.Возьмем такой код:

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

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

Итак, я хочу обернуть ExecuteAsync в TPL, если это возможно.Но я не могу ради своей жизни понять, как это сделать.

Есть идеи?

Ответы [ 2 ]

12 голосов
/ 09 августа 2011

TPL предоставляет TaskCompletionSource класс, который позволяет вам выставлять практически все в качестве Задачи.Вызвав SetResult или SetException , вы можете вызвать успешное выполнение или сбой задачи.В вашем примере вы, вероятно, могли бы сделать что-то вроде:

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);
foreach (var tile in task.Result)
{}

Или, если вы хотите объединить задачи:

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

Подробнее о TaskCompletionSource можно узнать по адресу http://blogs.msdn.com/b/pfxteam/archive/2009/06/02/9685804.aspx

1 голос
/ 09 августа 2011

Это было главной проблемой для меня, когда я изучал TPL.

То, что вы ищете, это TaskCompletionSource.Когда вы создаете TaskCompletionSource, он создает специальный объект Task (доступный по свойству TaskCompletionSource.Task), который завершается только при вызове методов SetResult или SetException для связанных TaskCompletionSource.

В этом посте объясняется , как обернуть операции APM с помощью TPL (а также Rx).См. Также эту суть , демонстрирующую операцию APM, заключенную в TPL.

...