将基于callback的asynchronous方法转换为等待任务的最佳方法
转换/包装使用callback的“经典”asynchronous方法返回(可等待的)任务的最佳方法是什么?
例如,给出以下方法:
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
的部分避免它。 如果您认为同步部分可能需要很长时间,请针对这两种版本的方法进行修复。
但是,如果只想在Task
版本中asynchronous运行(即在ThreadPool
),可以使用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; }); }
假设callback只处理成功的情况,你假设的实现是完全正确的。 如果在GetStringFromUrl实现的asynchronous基础中发生exception,目前会发生什么? 没有真正的方法让他们传播到行动callback…他们只是吞下它,并返回你null或什么?
我build议的唯一的事情就是使用XXXAsync后缀命名这种新的约定,例如asynchronous方法。