1. ホーム
  2. c#

[解決済み] コールバックベースの非同期メソッドを待ち受け可能なタスクに変換する最良の方法

2023-04-28 09:42:07

質問

コールバックを使用する "classic" 非同期メソッドを、(待機)タスクを返すものに変換/ラップする最良の方法は何でしょうか。

例えば、次のメソッドがあるとします。

public void GetStringFromUrl(string url, Action<string> onCompleted);

これをタスクを返すメソッドにラップする方法は、私が知っている唯一の方法です。

public Task<string> GetStringFromUrl(string url)
{
     var t = new TaskCompletionSource<string>();

     GetStringFromUrl(url, s => t.TrySetResult(s));

     return t.Task;
}

これしか実現方法がないのでしょうか?

また、GetStringFromUrl(url,callback)の呼び出しをタスク自体でラップする方法はありますか(つまり、呼び出し自体は同期的にではなく、タスクの中で実行されます)。

どのように解決するのですか?

あなたのコードは短く、読みやすく、効率的なので、なぜ代替品を探しているのか理解できませんが、何も思いつきません。私は、あなたのアプローチは合理的だと思います。

また、なぜオリジナル版では同期部分がOKなのに Task -をベースにしたものでは避けたいのか。同期部分に時間がかかりすぎると思うのであれば、両方のバージョンのメソッドでそれを修正します。

しかし、もし非同期で実行したいのなら(つまり ThreadPool の中だけで) Task バージョンでは Task.Run() :

public Task<string> GetStringFromUrl(string url)
{
    return Task.Run(() =>
    {
        var t = new TaskCompletionSource<string>();

        GetStringFromUrl(url, s => t.TrySetResult(s));

        return t.Task;
    });
}