Sau khi đọc this đăng một vài tháng trước, tôi đã trở thành hoang tưởng khi nhận được Result
của một Task<T>
và không ngừng gói tất cả các cuộc gọi của tôi đến số điện thoại ConfigureAwait(false)
hoặc Task.Run
. Tuy nhiên, vì một số lý do, mã sau hoàn tất thành công:Tại sao không gọi Nhiệm vụ <T> .Result bế tắc?
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?
}
}
}
Mã in Still here!
3 lần rồi thoát. Điều này có dành riêng cho HttpClient
rằng việc gọi số Result
có an toàn không (như trong những người đã viết nó với số điện thoại ConfigureAwait(false)
)?
bằng cách này .. nó đơn giản hơn nhiều để không chặn và sử dụng đang chờ đợi khi cần thiết hơn bằng cách sử dụng 'ConfigureAwait' ở khắp mọi nơi. – i3arnon
@ i3arnon Đúng, nhưng tôi đang viết một API hỗ trợ cả người gọi đồng bộ và không đồng bộ. –
@JamesKo: Tôi khuyên bạn nên sử dụng các phương thức không đồng bộ để hiển thị các API không đồng bộ. Tuy nhiên, nếu bạn * phải * hỗ trợ cả đồng bộ hóa và không đồng bộ (ví dụ, đối với khả năng tương thích ngược), thì bạn có thể tìm thấy [bài viết MSDN gần đây của tôi trên async] (https://msdn.microsoft.com/en-us/magazine/ mt238404.aspx) hữu ích. –