2014-07-14 18 views
6

Doświadczyłem kilku niewygodnych sporadycznych błędów, w których metody asynchroniczne zwracały pustkę zamiast zadania i dlatego nie były oczekiwane. Aby uniknąć takich problemów w przyszłości, próbuję stworzyć niestandardowy wzór resharpera, aby wyróżnić takie metody, jak ostrzeżenia.Jak skonfigurować program resharper, aby ostrzegał o metodach asynchronicznych, które zwracają nieważne

Utworzyłem wzór takiego:

async void $methodname$($arguments$) 
{ 
$statements$ 
} 

(gdzie argumenty i oświadczenia umożliwić nieograniczoną liczbę i sposób każdy pasuje to identyfikator zawierający 1 lub więcej znaków prawnych Identifier) ​​

dziwne Podkreśla wszystkie nieważne metody, a nie tylko asynchroniczne metody. Czy ktoś może zobaczyć mój błąd? Ponieważ wydaje się, że wspólny wzorzec próbuje się dopasować, a Google go nie zgłasza, wątpię, czy jest to nierozwiązany problem w Reshaper 8.2.1.

P.S. Wiem, że mój wzór nie będzie pasował do metody rodzajowe - czy mogę dostać pracy dla tych nierodzajową Zrobię to później)

UPDATE

Jak podkreślono w komentarzach Zdaję sobie sprawę, istnieją liczba fałszywych alarmów i fałszywych negatywów, których ta reguła nie byłaby w stanie obsłużyć. Obawiam się tutaj, jak dopasować asynchroniczne do pracy w resharperie - kiedy to działa, mogę poszukać reguły dokładniejszej.

+0

Co jeśli '$ nazwa_metody $' musi 'czekać' na wywołanie metody? – 48klocs

+1

Moje przeprosiny, jeśli moje pytanie jest niejednoznaczne, powodem, dla którego błędy wywołane tymi metodami były przeczące, było to, że metody, które chcę znaleźć, były rzeczywiście asynchroniczne i wymagały oczekiwania. Poprawka polega na tym, aby metody zwracały Zadanie, a zatem zachęcały/ostrzegały dzwoniących, by czekali na ich zakończenie. Prawie wszystkie metody asynchroniczne powinny zwracać zadanie lub zadanie . – Typhlosaurus

+3

Nie będzie możliwe uwzględnienie programów obsługi zdarzeń na najwyższym poziomie, które naprawdę powinny być "asynchroniczne".Nie odnosi się również do asynchronicznych lambad, które w moich doświadczeniach są najbardziej prawdopodobnymi przyczynami niezamierzonej metody 'async void'. – Servy

Odpowiedz

4

Naprawdę nie możesz tego zrobić. Sposób, w jaki niestandardowe wzorce Resharpera działają ewidentnie, jeszcze nie rozumieją słowa kluczowego async (dlatego podkreśla wszystkie metody zwracania pustki, a nie tylko te async). Możesz również zobaczyć this example, który pasuje zarówno do metod async, jak i non-async.

Co może zrobić, to spróbować znaleźć async metod wyszukując nazwy metody kończące się „Async”, tak:

async void $method$($parameters$) 
{ 
    $statements$ 
} 

Jeżeli identyfikator metoda jest zdefiniowana przez ten regexp: \b\w+(Async)\b

to pozwoli zastąpić to:

void RunAsync() // or async void RunAsync() 
{ 
    ... 
} 

z tym:

async Task RunAsync() 
{ 
    ... 
} 
+0

Dzięki, to jest pomocne i potwierdza moje podejrzenia. Dodam wzorzec oparty na nazwie i zobaczę, jak to działa. – Typhlosaurus

4

Używamy swobodny ReCommended Extension dla ReSharper w naszych projektach dla „void” asynchronicznym analizy. Rozszerzenie podkreśla nieodpowiednie użycie async void i zapewnia oczywiste szybkie poprawki.

Zasady analizy zostały opisane tutaj: ReCommended-Extension wiki.