Task.GetAwaiter().GetResult()
tercih edilir Task.Wait
ve Task.Result
istisnaları bir AggregateException
. Ancak, her üç yöntem de kilitlenme ve iş parçacığı havuzu açlık sorunları için potansiyele neden olur. Hepsinin lehine kaçınılmalıdır async/await
.
Aşağıdaki alıntı açıklıyor Task.Wait
ve Task.Result
basitçe bir istisna yayılma davranışını içermeyen Task.GetAwaiter().GetResult()
(nedeniyle "çok yüksek uyumluluk çubuğu").
Daha önce de belirttiğim gibi, çok yüksek bir uyumluluk çubuğumuz var ve bu nedenle değişiklikleri kırmaktan kaçındık. Bu nedenle, Task.Wait
her zaman sarma orijinal davranışını korur. Ancak, çalıştığınız eşzamanlı engellemeye benzer davranışlar istediğiniz Task.Wait
, ancak orijinal istisnanın, bir AggregateException
. Bunu başarmak için, Görev bekleyicisini doğrudan hedefleyebilirsiniz. “ await task;
” Yazdığınızda , derleyici bunu Task.GetAwaiter()
yöntemin kullanımına dönüştürür ve yöntemi olan bir örneği döndürür GetResult()
. Hatalı bir Görevde kullanıldığında GetResult()
orijinal istisnayı yayar (“ await task;
” davranışını bu şekilde alır). Böylece “task.GetAwaiter().GetResult()
“Bu yayılma mantığını doğrudan çağırmak istiyorsanız.
https://blogs.msdn.microsoft.com/pfxteam/2011/09/28/task-exception-handling-in-net-4-5/
“ GetResult
” Aslında “görevi hatalara karşı kontrol et” anlamına gelir
Genel olarak, eşzamansız bir görevde senkronize engellemeyi önlemek için elimden geleni yapıyorum. Ancak, bu kılavuzu ihlal ettiğim birkaç durum var. Bu nadir durumlarda, tercih ettiğim yöntem, GetAwaiter().GetResult()
görev istisnalarını bir AggregateException
.
http://blog.stephencleary.com/2014/12/a-tour-of-task-part-6-results.html
GetResult
: "Bu tip ve üyelerinin derleyici tarafından kullanılmak üzere tasarlanmıştır." Diğer kişi kullanmamalıdır.