Professional Documents
Culture Documents
Async - Magična Riječ Za Uspjeh Vase Aplikacije
Async - Magična Riječ Za Uspjeh Vase Aplikacije
vae aplikacije
Bahrudin Hrnjica
Senior Developer
Microsoft MVP C#
HMDN
Agenda
6 znaajki za bolju implementaciju vae aplikacije
Pattern
public Task<T> FooAsync()
{
var tcs = new
TaskCompletionSource<T>();
// schedule something
asynchronously
// to invoke tcs.Set*
return tcs.Task;
public Task
Task<T>
async
Delay(int
Task
RunAsync(Func<T>
RunStoryboardAsync(this
WaitForClickAsync(this
milliseconds)
func)
Button
Storyboard
button)
sb)
{
var tcs = new TaskCompletionSource<bool>();
TaskCompletionSource<T>();
RoutedEventHandler
EventHandler<object>
ThreadPool.QueueUserWorkItem(delegate
new
Timer(_ => tcs.SetResult(true)).Change(milliseconds,
handler
handler
= (s,e)
= (s,e)
=> =>
{
-1);
tcs.SetResult(true);
try { tcs.SetResult(func()); }
sb.Completed
button.Click
catch (Exception
+= handler;
e) {sb.Begin();
tcs.SetException(e); }
});
returntcs.Task;
await
tcs.Task;
}
sb.Completed
return
button.Click
tcs.Task;
-= handler;
}
#1
SomeMethod(cts.Token);
cts.Cancel();
Pattern
await SomeDotNetAsync();
await SomeWinRTAsync();
await SomeDotNetAsync(cancellationToken);
await SomeWinRTAsync().AsTask(cancellationToken);
#2
Moderna aplikacija nije samo dranje UI slobodnog za korisniki odziv. Ona prije svega
treba da radi ono to korisnik eli u datom trenutku.
Preporuka
Koristiti async void metode samo za top-level entry points (npr. UI event
handlers)
(Ne prosljeivati async lambde u WinRT metode u koliko niste sigurni 101%)
#3
Mnogi problem kod async koda uzrokovani su koritenjem async void neispravno.
await ConfigureAwait(false)
Iskljuuje vraanje u poetni Context (prethodni sluaj 2)
Koristiti ConfigureAwait(false) na svim await pozivima u bibliotekama
#4
Koritenje ConfigureAwait
async
async voi
voidd button1_Click()
button1_Click()
{{
aw
DoWorkAsync().Wait();
aw ai
DoWorkAsync().Wait();
aittDoWorkAsync();
DoWorkAsync();
}}
async
async
Task
DoWorkAsync()
async Task
Task
DoWorkAsync()
async
TaskDoWorkAsync()
DoWorkAsync()
{
{{
{
aw
ttt
al
aw
ai
Task.Run().ConfigureAwait(f
alse);
se);
aw
ai
Task.Run();
awai
ai
tTask.Run().ConfigureAwait(f
Task.Run();
Consol
e.WriteLine("D
one
ttask");
Consol
e.WriteLine("D
one
ask");
CConsol
e.WriteLine("D
one
ttask");
onsol
e.WriteLine("D
one
ask");
}}
}
Use
ConfigureAwait(false)
}
2.
2. Task.Run
Task.Run schedules
schedules
3.
3. Await
Await captures
captures
1.
1. DoWorkAsync
DoWorkAsync
work
work to
to run
run on
on thread
thread
SynchronizationContext
4.
UI
blocks
waiting
SynchronizationContext
4.
UI
blocks
waiting
invoked
on
UI
thread
invoked on UI thread
pool
pool
for
and
for DoWorkAsyncDoWorkAsyncand hooks
hooks up
up aa
returned
continuation
returned Task
Task to
to
continuation to
to run
run when
when
6.
5.
6. UI
UI thread
thread still
still
5. Task.Run
Task.Run task
task completes
completes on
on pool
pool &
&
complete
task
completes
complete
task
completes
blocked
invokes
blocked waiting
waiting for
for
invokes continuation
continuation which
which Posts
Posts back
back
async
to
async operation
operation to
to
to UI
UI thread
thread
complete.
complete.
Deadlock!
Deadlock!
.ConfigureAwait(false)
.ConfigureAwait(false) avoids
avoids
deadlock.
deadlock.
#5
Asinhrono
Inicijalizirati neto ovdje u odmah.
Mogu kontrolisati neto drugo odmah, iako mi prethodni kod nije
zavrio.
Sync vs Async
Pauza na 10 sekundi a zatim output Hello' na konzolu.
Synchronous
Asynchronous
public
Task PausePrintAsync()
public static
static async
Task PausePrintAsync()
{
{
var tcs = new
await Task.Delay(10000);
TaskCompletionSource<bool>();
Console.WriteLine("Hello");
new Timer(_ => {
}
Console.WriteLine("Hello");
Mogui
problem
odziva
aplikacija
tcs.SetResult(true);
}).Change(10000, Timeout.Infinite);
return tcs.Task;
}
Izuzetci
Metode od .WinMD dllova (asemblia)
Preklapanja u hierarhiji klasa
#5
#6
#7
Vano znati kako se dolo do neke take u kodu i ta se deava pri tom.
Ne zaboravite ispuniti
upitnike.
ekaju vas vrijedne
nagrade!