Czy powinienem unikać obsługi zdarzeń asynchronicznych?

Wiem, że używanie metod fire-and-forget do uruchamiania zadań jest uważane za zły pomysł, ponieważ nie ma śladu oczekującego zadania i trudno jest obsługiwać wyjątki, które mogą być wrzucone do takiej metody.

czy ogólnie powinienem unikać async void obsługi zdarzeń? na przykład,

private async void Form_Load(object sender, System.EventArgs e)
{
        await Task.Delay(2000); // do async work
        // ...
} 

Mogę to przepisać Tak:

Task onFormLoadTask = null; // track the task, can implement cancellation

private void Form_Load(object sender, System.EventArgs e)
{
        this.onFormLoadTask = OnFormLoadTaskAsync(sender, e);
} 

private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e)
{
        await Task.Delay(2000); // do async work
        // ...
} 

jakie są podwodne skały dla asynchronicznych obsługi zdarzeń, oprócz możliwości ponowne wejście?

Author: avo, 2013-10-16

4 answers

Wytyczną jest unikanie async void z wyjątkiem , gdy jest używany w programie obsługi zdarzeń, więc użycie async void w programie obsługi zdarzeń jest w porządku.

To powiedziawszy, dla testów jednostkowych często lubię uwzględniać logikę wszystkich metod async void. Np.,

public async Task OnFormLoadAsync(object sender, EventArgs e)
{
  await Task.Delay(2000);
  ...
}

private async void Form_Load(object sender, EventArgs e)
{
  await OnFormLoadAsync(sender, e);
}
 164
Author: Stephen Cleary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-16 23:25:38

Czy powinienem unikać również obsługi zdarzeń asynchronicznych void?

Zazwyczaj procedury obsługi zdarzeń to jeden przypadek, w którym void asynchroniczna metoda nie jest potencjalnym zapachem kodu.

Teraz, jeśli musisz śledzić zadanie z jakiegoś powodu, to technika, którą opisujesz, jest całkowicie rozsądna.

 53
Author: Eric Lippert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-16 23:25:33

Tak, ogólnie asynchroniczne unieważnienie procedur obsługi zdarzeń jest jedynym przypadkiem. Jeśli chcesz dowiedzieć się więcej na ten temat, Możesz sprawdzić świetny film tutaj na kanale 9

The only case where this kind of fire-and-forget is appropriate is in top-level event-handlers. Every other async method in your code should return "async Task".

Oto link

 6
Author: Idrees Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-07 06:34:31

Jeśli używasz ReSharper, DARMOWE zalecane rozszerzenie może być dla ciebie pomocne. Analizuje metody "asynchroniczne" i podświetla, gdy są niewłaściwie używane. Rozszerzenie może rozróżniać różne zastosowania async void i dostarczać odpowiednie szybkie poprawki opisane tutaj: ReCommended-extension wiki .

 5
Author: Alexander Zwitbaum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 00:34:10