Best Practices for Using async and await
Transcript of Best Practices for Using async and await
Dobre prakse pri uporabi async in awaitDamir Arh, Razum d.o.o.Microsoft MVP@DamirArhhttp://www.damirscorner.com
AgendaOsnoveasync void je nevarenLažne asinhrone in sinhrone metodeConfigureAwait(false)?
Sinhrono : asinhrono
O odzivnem uporabniškem vmesniku
private void OnSync(object sender, RoutedEventArgs e){ StatusText.Text = "Processing..."; Thread.Sleep(_sleepPeriod); StatusText.Text = String.Empty;}
Sinhrono izvajanje
Glavna nit
private async void OnAsync(object sender, RoutedEventArgs e){ StatusText.Text = "Processing..."; await Task.Delay(_sleepPeriod); StatusText.Text = String.Empty;}
Asinhrono izvajanje
Glavna nit
async void?
Ne, hvala!
async voidprivate async void OnGetData(object sender, RoutedEventArgs e){ try { DownloadMessages(); await Task.Delay(75); StatusText.Text = $"Messages received: {_messages.Count}"; } catch (Exception exception) { StatusText.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); StatusText.Text = $"Messages received: {_messages.Count}"; } catch (Exception exception) { StatusText.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); StatusText.Text = $"Messages received: {_messages.Count}"; } catch (Exception exception) { StatusText.Text = exception.Message; }}
Glavna nit
private async Task DownloadMessagesAsync(){ _messages = await _repository.GetMessagesAsync();}
Lažno predstavljanje
Ni vse asinhrono, kar je async
Testna kodavar tasks = new Task[_iterations];var stopwatch = new Stopwatch();
stopwatch.Start();for (int i = 0; i < _iterations; i++){ tasks[i] = AsyncService.CallAsync(i);}Task.WaitAll(tasks);stopwatch.Stop();
var duration = stopwatch.ElapsedMilliseconds;
Prava in lažna implementacijapublic async Task TrueAsync(int index){ Console.WriteLine($"Start {index}"); await Task.Delay(millis); Console.WriteLine($"End {index}");}
public async Task FakeAsync(int index){ return await Task.Run(() => { Console.WriteLine($"Start {index}"); Thread.Sleep(Millis); Console.WriteLine($"End {index}"); });}
Pravo asinhrono izvajanjezačetek 1
konec 4
začetek 2začetek 3začetek 4
konec 2konec 3konec 1
konec 1 konec 2 konec 3 konec 4
Vrsta
Lažno asinhrono izvajanje
začetek 1začetek 2
začetek n
začetek 5
začetek 3začetek 4
začetek 6
Zaloga niti
konec 5
V smrtnem objemu
Glavna nit je le ena
Smrtni objemprivate 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 kodaprivate async void OnDeadlock(object sender, RoutedEventArgs e){ var result = await GetAsync().Result;}
private async Task<string> GetAsync(){ await Task.Delay(500); return String.Empty;}
Glavna nit
ConfigureAwait pomagaNe naredite si medvedje usluge
SynchronizationContextAbstrakcija privzetega izvajalnega kontekstaOdvisen od tipa aplikacijeWindows FormsWPFASP.NET
ConfigureAwait odloča o vračanju na privzeti kontekstV aplikaciji običajno zaželenoV knjižnicah tipično nepotrebno
Ključni poudarkiUporabljajte async void le pri odzivih na dogodkeZaloga niti je omejen vir v aplikacijiUporabljajte za procesorsko zahtevne operacijeNe uporabljajte za vhodno-izhodne operacije
Uporabljajte asinhrone in sinhrone operacije kot takšne
Virihttp://bit.ly/ch9async http://bit.ly/AsyncAwaitBasicshttp://bit.ly/NoAsyncThreadhttp://bit.ly/SyncCtx
Izpolnite anketo! Vam je bilo predavanje všeč? Ste se naučili kaj novega?
Vaše mnenje nam veliko pomeni!
Da bo NT konferenca prihodnje leto še boljša, vas prosimo, da izpolnite anketo o zadovoljstvu, ki jo najdete v svojem NTK spletnem profilu.
© 2015 Microsoft Corporation. All rights reserved.