best practices for using async and await
Post on 12-Apr-2017
163 Views
Preview:
TRANSCRIPT
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
top related