8

TPLを既存のAPI、具体的にはRestSharpで使用したいので、継続を使用できます。

しかし、これは、非同期に従来の.NETアプローチを採用せず、代わりにコールバックを実装するAPIをラップする必要があることを意味します。次のようなコードを取ります。

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

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

したがって、可能であれば、ここでExecuteAsyncをTPLでラップします。しかし、私は私の人生のためにそれを行う方法を理解することはできません。

何か案は?

4

2 に答える 2

12

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を参照してください。

于 2011-08-09T01:49:50.700 に答える
1

これは、TPLを学ぶときの私にとっても大きな問題でした。

あなたが探しているのはですTaskCompletionSource。を作成すると、関連付けられたのまたはメソッドを呼び出したときにのみ完了TaskCompletionSourceする特別なTaskオブジェクト(プロパティからアクセス可能)が作成されます。TaskCompletionSource.TaskSetResultSetExceptionTaskCompletionSource

この投稿では、APM操作をTPL(およびRx)でラップする方法について説明します。TPLにラップされたAPM操作を示すこの要点も参照してください。

于 2011-08-09T16:30:51.050 に答える