几个月前,我读了这篇文章后,变得对获取Task<T>
的Result
产生了妄想,并不断地用ConfigureAwait(false)
或Task.Run
包装我的所有调用。然而,由于某种原因,以下代码成功完成:
public static void Main(string[] args)
{
var arrays = DownloadMany();
foreach (var array in arrays);
}
IEnumerable<byte[]> DownloadMany()
{
string[] links = { "http://google.com", "http://microsoft.com", "http://apple.com" };
using (var client = new HttpClient())
{
foreach (var uri in links)
{
Debug.WriteLine("Still here!");
yield return client.GetByteArrayAsync(uri).Result; // Why doesn't this deadlock?
}
}
}
代码会打印三次“Still here!”然后退出。这个问题是否只适用于HttpClient,即在它上面调用Result是安全的(就像编写它的人已经使用ConfigureAwait(false)进行了处理)?
ConfigureAwait
要简单得多。 - i3arnon