[英]Using TPL with existing async APIs
我想將TPL與現有的API一起使用,RestSharp是特定的,所以我可以使用continuation。
但這意味着我必須將一個不采用傳統.NET方法的API包裝成異步,而是實現回調。 拿這樣的代碼:
var client = new RestClient("service-url");
var request = new RestRequest();
client.ExecuteAsync<List<LiveTileWeatherResponse>>(request,
(response) =>
{
...
});
所以我想在TPL中包裝ExecuteAsync,如果可能的話。 但我不能為我的生活,弄清楚如何做到這一點。
有任何想法嗎?
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)
{}
}
);
您可以在http://blogs.msdn.com/b/pfxteam/archive/2009/06/02/9685804.aspx上閱讀有關TaskCompletionSource的更多信息。
在學習TPL時,這對我來說是一個主要的痛點。
您正在尋找的是TaskCompletionSource
。 當您創建TaskCompletionSource
,它會創建一個特殊的Task
對象(可由TaskCompletionSource.Task
屬性訪問),該對象僅在您在關聯的TaskCompletionSource
上調用SetResult
或SetException
方法時才會完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.