转换/包装使用回调返回(可等待)任务的“经典”异步方法的最佳方法是什么?
例如,给出以下方法:
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(使用前将#替换为@)