Best Practices for Using async and await

Preview:

Citation preview

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

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.

Recommended