En iyi uygulamalar

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.