En iyi uygulamalar
Bu sayfada
Eşzamansız boşluktan kaçının
-
“async void"i güvenle kullanabileceğiniz tek yer olay işleyicileridir. Aşağıdaki kodu göz önünde bulundurun:
private async Task<bool> SomeFuncAsync() { ... await ... } public void button1_Click(object sender, EventArgs e) { var result = SomeFuncAsync().Result; SomeOtherFunc(); }
“async” çağrısı tamamlandığında, “SynchronizationContext"in kullanılabilir hale gelmesini bekler. Ancak olay işleyici, ‘SomeFuncAsync’ yönteminin tamamlanmasını beklerken ‘SynchronizationContext’i tutar; böylece dairesel bir beklemeye (kilitlenmeye) neden olur.
Bunu düzeltmek için olay işleyicisini şu şekilde değiştirmemiz gerekiyor:
public async void button1_Click(object sender, EventArgs e) {
var result = await SomeFuncAsync();
SomeOtherFunc();
}
-
Bir “async void” yönteminden atılan herhangi bir istisna, doğrudan “async void” yöntemi başlatıldığında etkin olan “SynchronizationContext” üzerinde oluşturulacaktır.
private async void SomeFuncAsync() { throw new InvalidOperationException(); } public void SomeOtherFunc() { try { SomeFuncAsync(); } catch (Exception ex) { Console.WriteLine(ex); throw; } }
the exception is never caught by the catch block in
SomeOtherFunc
. -
“async void” yöntemleri, arama kodunu tamamladıklarını bildirmenin kolay bir yolunu sağlamaz
-
“async void” yöntemlerinin test edilmesi zordur. MSTest eşzamansız test desteği yalnızca ‘Görev’ veya ‘Görev
’ döndüren ‘zaman uyumsuz’ yöntemler için çalışır.