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?
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);
}
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.
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
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 .
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