将基于回调的异步方法转换为可等待任务的最佳方法

2023-12-10

转换/包装使用回调返回(可等待)任务的“经典”异步方法的最佳方法是什么?

例如,给出以下方法:

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) 的调用包装在任务本身中(即调用本身将在任务内部运行而不是同步运行)


你的代码简短、可读且高效,所以我不明白你为什么要寻找替代方案,但我想不出任何东西。我认为你的做法是合理的。

我也不确定为什么你认为同步部分在原始版本中没问题,但你想在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;
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将基于回调的异步方法转换为可等待任务的最佳方法 的相关文章

随机推荐