this question'u takip ediyorum ve Peter Duniho tarafından popüler (arkasındaki kabul edilmemiş olsa da) yanıtın nedenlerini anlıyorum. Özellikle, değil müteakip uzun süren operasyon UI iş parçacığı engeller bekleyen farkındayım:Yuvalanmış bekletme işlemleri beklenir mi?
ikinci örnek asenkron çalışma sırasında ortaya koymamıştır. Bunun yerine, content.Result özelliği değerini alarak, asıl iş parçacığı, asenkron işlem tamamlanana kadar beklemeye zorlar.
Hatta, kendi yararı için bu, teyit şöyle ettik:
private async void button1_Click(object sender, EventArgs e)
{
var value1 = await Task.Run(async() =>
{
await Task.Delay(5000);
return "Hello";
});
//NOTE: this one is not awaited...
var value2 = Task.Run(async() =>
{
await Task.Delay(5000);
return value1.Substring(0, 3);
});
System.Diagnostics.Debug.Print(value2.Result); //thus, UI freezes here after 5000 ms.
}
Ama şimdi merak ediyorum: Bir dıştaki awaitable içinde yuvalanmış await
bütün "awaitable" operasyonlar gerekiyor operasyon?
private async void button1_Click(object sender, EventArgs e)
{
var value0 = await Task.Run(() =>
{
var value1 = new Func<Task<string>>(async() =>
{
await Task.Delay(5000);
return "hello";
}).Invoke();
var value2 = new Func<string, Task<string>>(async (string x) =>
{
await Task.Delay(5000);
return x.Substring(0, 3);
}).Invoke(value1.Result);
return value2;
});
System.Diagnostics.Debug.Print(value0);
}
Veya bunu yapabilirsiniz:: Örneğin, ben bunu yapabilirsiniz
private async void button1_Click(object sender, EventArgs e)
{
//This time the lambda is async...
var value0 = await Task.Run(async() =>
{
//we're awaiting here now...
var value1 = await new Func<Task<string>>(async() =>
{
await Task.Delay(5000);
return "hello";
}).Invoke();
//and we're awaiting here now, too...
var value2 = await new Func<string, Task<string>>(async (string x) =>
{
await Task.Delay(5000);
return x.Substring(0, 3);
}).Invoke(value1);
return value2;
});
System.Diagnostics.Debug.Print(value0);
}
Ve ikisi de UI dondurun. Hangisi tercih edilir?
Ben hepsi aynı şeyi yazdırmak olanlar ise bir çeşit Görev nesnesi yazdırmakta olduğunu düşünürsek çok şaşıracaksınız Sonuçtan ziyade. –
@BenVoigt - Hayır, bc'de her iki durumda da görev beklendiğinden beri açılmıyor. –
Ama bunlardan biri ikinci bir Görev. –