2014-05-17 11 views
17

According to an article in MSDN Magazine, najlepszą praktyką jest "Użyj ConfigureAwait(false), kiedy możesz." Ponadto stwierdza: "Jeśli możesz użyć ConfigureAwait w pewnym momencie metody, to polecam użyć go dla każdego czekającego w tej metodzie po tym punkcie." Stephen Cleary, autora tego artykułu, states on his blog, który mówi: "W swoich asynchronicznych metodach " biblioteka "użyj ConfigureAwait (fałsz) wszędzie, gdzie to możliwe [podkreślenie dodane]."Skonfiguruj ConfigureAwait (false) dla całego projektu/dll

Biorąc pod uwagę, że większość lub wszystkie z moich await stwierdzeń w projekcie bibliotecznym, który ma być szeroko stosowany, powinno mieć .ConfigureAwait(false) czy można coś zrobić/zmienić ustawienie tak, aby domyślne zachowanie czekało w moim projekcie/dll nie ma kontynuować przechwyconego kontekstu? Oznacza to, że można pominąć wszystkie wywołania do .ConfigureAwait(false) i zamiast tego dodać tylko12013 tylko wtedy, gdy potrzebuję zachować kontekst.

Odpowiedz

14

Nie, nie ma opcji dla tego. Zespół firmy Microsoft rozważył ustawienie kompilatora lub coś takiego dla tego zachowania, ale w końcu odrzucił je.

Głównym powodem jest to, że dość trudno jest powiedzieć, jak zachowuje się kod, nie wiedząc, jak ustawiono przełącznik kompilatora.

+5

Z pewnością byłby przydatny, gdyby istniał atrybut, który moglibyśmy zastosować do klasy lub funkcji, która określiła domyślną wartość ConfigureAwait. –

+0

Może być dobrze przetestować ConfigAwait (false) w dowolnej strukturze testowej. Każdy wie, czy tego rodzaju funkcjonalność istnieje w jakiejkolwiek strukturze. –

+1

@AbdulSaboor: W dzisiejszych czasach są analizatory kodu, które mogą zmusić Cię do używania 'ConfigureAwait' (albo' true' lub 'false'), aby było to wyraźne. Osobiście ich nie używam, ale widzę ich korzyści, zwłaszcza w większych zespołach. –

11

Istnieje obecnie biblioteka stron trzecich, która obsługuje tę funkcję. Pakiet Nuget ConfigureAwait.Fody umożliwia użycie atrybutu ConfigureAwait do oznaczenia klasy, zespołu lub metody, tak aby wszystkie oczekiwania były następujące: .ConfigureAwait(false). project page ma ten przykład wykorzystania:

using Fody; 

[ConfigureAwait(false)] 
public class MyAsyncLibrary 
{ 
    public async Task MyMethodAsync() 
    { 
     await Task.Delay(10); 
     await Task.Delay(20); 
    } 

    public async Task AnotherMethodAsync() 
    { 
     await Task.Delay(30); 
    } 
} 

nie próbowałem ten sam, ale biorąc pod uwagę to, co wiem o tym, jak Fody dodatkom pracy, to z pewnością możliwe.

+3

Program ConfigureAwait.Fody jest dobrym pomysłem, ale obecna implementacja jest błędna i nie jest aktywnie obsługiwana. –

+0

Z tego powodu nie została zarejestrowana na serwerze nuget. – AgentFire

Powiązane problemy