SORU
20 Mart 2013, ÇARŞAMBA


Güvenli bir şekilde C zaman uyumsuz yöntem çağrısı nasıl# bekliyor olmadan

Veri döndürür async bir yöntem var:

public async Task MyAsyncMethod()
{
    // do some stuff async, don't return any data
}

Bazı veri verir: başka bir yöntemle bunu arıyorum

public string GetStringData()
{
    MyAsyncMethod(); // this generates a warning and swallows exceptions
    return "hello world";
}

Bunu beklemeden MyAsyncMethod() arama "Because this call is not awaited, the current method continues to run before the call is completed" visual studio uyarı. bir neden Bu uyarı için sayfada Birleşik Devletleri:

Eğer tamamlamak için zaman uyumsuz çağrı ve bunun için beklemek istemediğinden emin misin yoksa sadece uyarı engelleniyor düşünmelisinizaranan yöntem, herhangi bir istisna yetiştirmek istemiyorum.

Tamamlamak için çağrı beklemek istemiyorum eminim; gerek yok ya da zamanı var.Ama aramaolabilirözel durumlar oluşturmak.

Bu sorun, birkaç kez denk geldim ve ortak bir çözüm olması gereken ortak bir sorun olduğuna eminim.

Nasıl güvenli bir şekilde sonucu beklemeden bir zaman uyumsuz yöntem çağrısı mı?

Güncelleme:

İnsanlar sadece sonuç bekliyor önerdiğin için, bu web servisi üzerinde bir web isteği (ASP.NET Web API) yanıt kodu. UI bir bağlamda bekliyor UI iş parçacığı ücretsiz tutar, fakat web arama isteği içinde bekleyen Görev için isteğine yanıt vermeden önce, böylece kez sebepsiz yere tepki artan bitirmek için bekler.

CEVAP
20 Mart 2013, ÇARŞAMBA


Eğer durum almak istiyorsanız "uyumsuz", yapabilirsin:

  MyAsyncMethod().
    ContinueWith(t => Console.WriteLine(t.Exception),
        TaskContinuationOptions.OnlyOnFaulted);

Bu bir iş parçacığı "" parçacığı. ana dışında bir durum ile başa çıkmak için izin verecektir Bunun anlamı yok "bekle" çağrısıMyAsyncMethod() konu arama MyAsyncMethod; ama, yine de size izin verir bir şey yapmak ile bir istisna ... ama yalnızca bir özel durum oluşur.

Güncelleme:

teknik olarak, bir şey await ile benzer yapabilirsiniz:

try
{
    await MyAsyncMethod().ConfigureAwait(false);
}
catch (Exception ex)
{
    Trace.WriteLine(ex);
}

...gerekli olan yararlı eğer ihtiyacın özellikle kullanın try/catch (using) ama ben bul ContinueWith biraz daha açık çünkü bilmen gerekiyor ne ConfigureAwait(false) anlamına gelir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AmazonWireless

    AmazonWirele

    8 EYLÜL 2010
  • GOTO Conferences

    GOTO Confere

    3 EKİM 2011
  • Jonathan Morrison

    Jonathan Mor

    24 Mart 2010