我正在研究 C# Asnc-await 模式,目前正在阅读 S. Cleary 的 C# Cookbook 中的并发
他讨论了使用 TaskCompletionSource (TCS) 将旧的非 TAP 异步模式包装到 TAP 结构中。我不明白的是,为什么他只返回 TCS 对象的 Task 属性而不是等待它 TCS.Task ?
这是示例代码:
旧的包装方法是 DownloadString(...):
public interface IMyAsyncHttpService
{
void DownloadString(Uri address, Action<string, Exception> callback);
}
将其包装到 TAP 构造中:
public static Task<string> DownloadStringAsync(
this IMyAsyncHttpService httpService, Uri address)
{
var tcs = new TaskCompletionSource<string>();
httpService.DownloadString(address, (result, exception) =>
{
if (exception != null)
tcs.TrySetException(exception);
else
tcs.TrySetResult(result);
});
return tcs.Task;
}
现在为什么不这样做:
public static async Task<string> DownloadStringAsync(
this IMyAsyncHttpService httpService, Uri address)
{
var tcs = new TaskCompletionSource<string>();
httpService.DownloadString(address, (result, exception) =>
{
if (exception != null)
tcs.TrySetException(exception);
else
tcs.TrySetResult(result);
});
return await tcs.Task;
}
两者在功能上有区别吗?第二个不是更自然吗?