【发布时间】:2015-09-20 15:01:30
【问题描述】:
按照When at last you await 中的指南,每当我同步返回另一个任务而不是等待它时,我似乎都会收到TaskCanceledException。
TaskCanceledException 代码
public static class Download
{
public static Task<byte[]> FromYouTubeAsync(string videoUri)
{
using (var client = new HttpClient())
{
return FromYouTubeAsync(
() => client
.GetStringAsync(videoUri),
uri => client
.GetByteArrayAsync(uri));
}
}
public async static Task<byte[]> FromYouTubeAsync(
Func<Task<string>> sourceFactory, Func<string, Task<byte[]>> downloadFactory)
{
string source = await // TaskCanceledException here
sourceFactory()
.ConfigureAwait(false);
// find links
return await
downloadFactory(links.First())
.ConfigureAwait(false);
}
}
无异常代码
这里,方法签名的第一个重载被更改为异步,它等待第二个重载。出于某种原因,这会阻止TaskCanceledException。
public static class Download
{
public async static Task<byte[]> FromYouTubeAsync(string videoUri)
{
using (var client = new HttpClient())
{
return await FromYouTubeAsync(
() => client
.GetStringAsync(videoUri),
uri => client
.GetByteArrayAsync(uri));
}
}
public async static Task<byte[]> FromYouTubeAsync(
Func<Task<string>> sourceFactory, Func<string, Task<byte[]>> downloadFactory)
{
string source = await // No exception!
sourceFactory()
.ConfigureAwait(false);
// find links
return await
downloadFactory(links.First())
.ConfigureAwait(false);
}
}
为什么会发生这种情况,我可以做些什么来解决它(除了等待方法,这会浪费资源,如上面链接中所述)?
【问题讨论】:
标签: c# asynchronous async-await task