簡體   English   中英

將TPL與現有異步API一起使用

[英]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類,它允許您將幾乎任何東西暴露為任務。 通過調用SetResultSetException ,可以使任務成功或失敗。 在您的示例中,您可能會執行以下操作:

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上調用SetResultSetException方法時才會完成。

這篇文章解釋了如何用TPL (以及Rx) 包裝APM操作 另請參閱此要點,演示包含在TPL中的APM操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM