Best Practices for Using async and await

Preview:

Citation preview

Dobre prakse pri uporabiasync in await

Damir Arh, Razum d.o.o., Microsoft MVP

Agenda

• Osnove• async void je nevaren• Lažne sinhrone metode• ConfigureAwait(false)

O odzivnem uporabniškem vmesniku

Sinhrono : asinhrono

Sinhrono izvajanje

private void OnSync(object sender, RoutedEventArgs e){ StatusText.Text = "Processing..."; Thread.Sleep(_sleepPeriod); StatusText.Text = String.Empty;}

Glavna nit

Asinhrono izvajanje

private async void OnAsync(object sender, RoutedEventArgs e){ StatusText.Text = "Processing..."; await Task.Delay(_sleepPeriod); StatusText.Text = String.Empty;}

Glavna nit

Ne, hvala!

async void?

async voidprivate async void OnGetData(object sender, RoutedEventArgs e){ try { DownloadMessages(); await Task.Delay(75); Status.Text = $"Received: {_messages.Count}"; } catch (Exception exception) { Status.Text = exception.Message; }}

Glavna nit

private async void DownloadMessages(){ _messages = await _repository.GetMessagesAsync();}

Lovljenje izjemprivate async void OnGetData(object sender, RoutedEventArgs e){ try { DownloadMessages(); await Task.Delay(75); Status.Text = $"Received: {_messages.Count}"; } catch (Exception exception) { Status.Text = exception.Message; }}

Glavna nit

private async void DownloadMessages(){ _messages = await _repository.GetMessagesAsync();}

Popravljena kodaprivate async void OnGetData(object sender, RoutedEventArgs e){ try { await DownloadMessagesAsync(); await Task.Delay(75); Status.Text = $"Received: {_messages.Count}"; } catch (Exception exception) { Status.Text = exception.Message; }}

Glavna nit

private async void Task DownloadMessagesAsync(){ _messages = await _repository.GetMessagesAsync();}

Glavna nit je le ena

V smrtnem objemu

Smrtni objem

private void OnDeadlock(object sender, RoutedEventArgs e){ var result = GetAsync().Result;}Glavna nit

private async Task<string> GetAsync(){ await Task.Delay(500); return String.Empty;}

Popravljena koda

private async void OnDeadlock(object sender, RoutedEventArgs e){ var result = await GetAsync().Result;}Glavna nit

private async Task<string> GetAsync(){ await Task.Delay(500); return String.Empty;}

Ne naredite si medvedje usluge

ConfigureAwait pomaga

SynchronizationContext

• Abstrakcija privzetega izvajalnega konteksta• Odvisen od tipa aplikacije

– WindowsForms– WPF– ASP.NET

• Vračanje na privzeti kontekst– V aplikaciji običajno zaželeno– V knjižnicah tipično nepotrebno

Ključni poudarki

• Uporabljajte async void le pri odzivih na dogodke

• Uporabljajte asinhrone operacije kot takšne• Razmislite, kako se bodo asinhroni klici izvajali

Viri

• http://bit.ly/ch9async • http://bit.ly/AsyncAwaitBasics• http://bit.ly/SyncCtx

@DamirArhhttp://www.damirscorner.com

Recommended