You are on page 1of 10

c  


   
c  
  V VV VV
  VV V V VV
V V
   V V VafterVV  V VVV  V  V
V    V   V
V
VVV  V V V V VV  V   V V V  V
V V  V
  V

   V   V V 


V
V  V V  V
V
V  V VV VV
 VV V VV  VV VV VV V V V V 
V V V
  V  V   VVV V  V
V    V  V V V VV V
V V VV
V V

V    V  V V  V    V   V VV

V VV VV


V   V  VVV V   VV VV    V   VVV V
V V V VV  V
VV   V V V V V VV
 VV  V
V    V V V  VV V   V   V V

c    V V V V


  V V !V V V V V V
V V
   V   V  V    V
  V  
 
 V VawaitV  V V
 V VVV
VV   V
VV    V
  VVV   V  V V V V
    V
VV  V V VVV V VV"V
VV  V  V V
V VVV V  V V     VV V V    V V V V V
 V  V

 V    V
  V V !V V V  VvoidVV V
VVVTaskVVTask<T>.V !VV
V  V V
VV
VV    V
V V V Vawait#V V V VV  
V V
 V  VVVTaskV VTask<T>V  
V V  V V VV V V   V
 VV V VV  V VV    V
V    V   VVV
 V
V    V V VV V$VV V V V V  V


 V
VV
VTaskV VTask<T>V

V
 V V  V V
V V    V   %V

Task<Movie> GetMovieAsync(string title);


Task PlayMovieAsync(Movie movie);
async void GetAndPlayMoviesAsync(string[] titles)
{
foreach (var title in titles)
{
var movie = await GetMovieAsync(title);
await PlayMovieAsync(movie);
}
}
ÿV     V    V   V VV
V& 'VVV V V
V V   V
 V V V
VVV V V  VÿVGetMovieAsyncV VPlayMovieAsyncV  V
 V V V V V   V VV   Vawait#VÿV   V
GetAndPlayMoviesAsyncV  VvoidVV V   V VVawait#V( V    V
   V V
 V
VV V&
V V
'V V V 
VV
V   V V
 V    V

GetAndPlayMoviesAsyncV V VVVasyncV


V V V    V
  V   VV
 V  V V
V V V     V VV V V V
   V  VV V
VV V %VV V V V
V V V  V V V  VV V V) VV
 V V V V V V   V
VVGetAndPlayMoviesAsyncVV  VV V

V V V  V VV V V V V   V
V V V V V
  V VV   V
V V%V V&V 'V V V V V V V  V

c   
 
 V   V V VVV   V
  V V V V VVasyncV
V
V
  V  VVasyncV
V V V  V

   V
  V V  V

 V
VV
  V V V V    V V
Ú t %V V    V VV  V V Vawa t-expre V  VV  V V
 V V V V VV V V   VV

D

V  V
V !V V V V
%V

ÃethÚ-ÃÚ f er:V
V
asyncpt
laà Úa-expre :V
asyncptVVVaÃ-ft - atreVVV=>VVVaÃ-ft - ÚV
aÃ-ÃethÚ-expre :V
asyncptVVVdelegateVVVexpl  t-aÃ-ft - atreptVVV l V
VasyncV
V V V V VÃethÚ-Úelarat VVVÃethÚ- ÚV V V*;#V

V VasyncV V V   VV V V   V  VV VV V V V V


  V V  
V VV
 V V V+ V V    ,-%V

using async = System.Threading.Tasks.Task;


ŝ
async async async(async async) { }
ü

     
 
V  VV
V V    V
  V VV VvoidVTaskVVTask<î>V
VVîVVV
  VV
V V   V
  V VV  VVV
V VV
VV VV  VV
 V V V V  VV

 V V    V
  V VV  VVvoidVVTaskVreturnV  V V V V V
  V

 V V    V
  V VV  VVTask<î>V
VVîVreturnV  V V V V
  V V V  V   VVîV VV  V
VVV VV   V

× 
    
 
    V
V V    V
  V  V V V

 V
V V   V
  V.V
 V  V VawaitV  VV    V
  VÃaV  VV V V V V V
   V V VV
V


VV  VV
VV    V
  V V V V VTaskVVTask<î>V VV  VVV
VV V  V VVVnullV
V   V
VV    VV V 
V
V  V V VV V V V V V  V V V V  V  V
 V V  V V VV V
VV  VTask<î>V
V V   V V V V V
V  VV    VVV V V V V
V VV   VV  V
V


VV  VV
VV    V
  V VvoidV  V V  VVV V
V   V
V
V    VV V 
V  V  V
V V   V V V V V
V  VV    VVV   V V VV VV V VV
 V V

) V V    V
  V V V V VV V V V V V
VV %V V


V V VawaitV  VV 

VV

c
   
c 
 
 V V VV  VV   V
V V    V
  V  VV  V
 V V

D

V  V
V !V V V V
%V

ar-expre :V
V
awa t-expre V
awa t-expre :V
awaitVar-expre V
tateÃet-expre :V
V
awa t-expre V
 VawaitV  V V V V  V VVV
V V   V  V
V V
   V
  V V V
V V V  V
VVV
V V   V
  V V V
catchVVfinallyV V
V Vtr-tateÃetV  VV V
V Vl -tateÃetVV V VunsafeV
 VV

( V VawaitV  V V V V V V    V  V V V VV 


V V
V
VawaitV V V  
V

î  



V  V„V
V Vawa t-expre Vawait „V V VVta V
VVawaitV  VV V„V V
 VVVawa ta leV V V V V
VV
 V V%V

V („).GetAwaiter()V V V  V  V
VVcV
V 0  V V  VV
VVcV V V  V V
VVSystem.ActionV
().BeginAwait( )V V V  V lea-expre V
V 0  V V  VV
VVcV().EndAwait()V V V  V  V

cV V VVawa terVV
VV  V  VVGetAwaiterVV V VV V V
 V
VV VV

VBeginAwaitVV V VV  V V V     V VV  V VV     V V


VVreÃpt VÚeleateV V V
V VV

VEndAwaitVV V VV VV  V


VV V V V V VV

VV V VVV   VV V


VGetAwaiterVBeginAwaitV VEndAwaitV VV
 V  VVV   VVV V V  V V V VV V V  V
VV  VVV  V  V  VV
VV V  VVV&  /  '0V V
V V VV  V VV V
V V 
V  V
V VV
V V   VV
VV

à 


V Vawa t-expre Vawait „V V  V V V  
VV V V VV  V().EndAwait()V
V V %V

V 
VV  V().EndAwait()V V VVV V V  VvoidVV V V
 V
V m VV V V V  V
VVV  VV().EndAwait()V

× 
  
   
1  VV   V
VVV
VV    V
  Vawait „V V  V V
%V
V  V  VV V VV   VV  V(„).GetAwaiter()V
V V V  V().BeginAwait( )V V  VV V V V VV
V
   V V V   V
VV  V    V
  VVV V VV
 VawaitV  V
V 
VV V  V VtrueV V    V V  V V  V V  VV
VV V VV VV    V
  V
V  V+ V  V
 VV  V   -VV  V().EndAwait()V V
  V
V V  V V  V V  V VV V
VVawa t-expre Vm VV
 V V  V

VBeginAwaitVV V  VVe therV  VfalseV   V VV V  V V


VrV VV V VVV V VV VV  V V V V
Vawait# V
V  / V VV  V   V   V VV V V  V
 V


VBeginAwaitV  VtrueVV  V V V V VV V V V V VV V

VBeginAwaitV  VfalseVV  V V V V VV V V V V V
V V V
V VV   V V  V V 
V

à   
 VVV  V
V    V   V
  VV V
V    V
V   V

  V VV V
V   V23V V
V V
%V

 VaÃ-ÃethÚ-expre VVlaà Úa-expre V V  


V V V   V
  V+4×  
  
 
 -VV  VV V V VV V VV  V  VV V
  V VVV  VVV(
V V VVV V   V V V
  V
  V V %V

V 
V V   V VaÃ-ft - atreV VV V V VV V V
V
  V
V 
V VV V   V VaÃ-ft - atreV VV
pV V V V5VVV  V
V VV
pV V  V
VV V VVoutV  V
V
pV 
VV V    V V  V
VV V VVrefV  V
V
V 
V V V V VV  V V V  V VV VV VV V
V
VV   V  V V V
V 
V V V V  VV  V VV V VrefVVoutV  V
V 
VVV
V V V V  V Ve therVV V VvoidV  VVrV V V    V V
V  VV
VV VTaskV V V V  V
V V V  VVV
VV
  V  V VVVV
V V V V  V  V+V46-V V VV
 V V VtateÃet-expre V+472-V
V 
VVV
V V V V  V V Ve therVV V VvoidV  VVrV V V    V
VV  VV
VV VTaskV V V V  V
V V V  VVV
VV
  V  V VVVV
V V V V  V  V V+V478-V V V V
returnV  V
V V  V
V 
VVV
V V V V  V Ve therV V V   V VV V V  / V  VVTV
rV V V    V VV V V  VVTask<T>V V V V  V
V V V  V
VV
VV   V  V VVVV
V V V V  V  V+V46-V V V
 V   VVTV
V 
VVV
V V V V  V V Ve therV V V   V VV V V  / V  V
VTVrV V V    V VV V V  VVTask<T>V V V V  V
V V V
  VVV
VV   V  V VVVV
V V V V  V  V V+V
478-V V V  /  V V V V V VreturnV  V
V V  V
 V V  V   VVTVV

 V  VVVExpression<>V V   V V V   V


  V V
VV V
VV V   V V V

 V   V
  V VV  VV  VV%V V VV    V
ex tV V
V V  / V V VV V
VV   V  %V

V   V VV  V    V V


V   V  V V  V
V V    V

î         



)V   V
  V V V V VV
 V V V   V  V
 V V V V  VV   V    V
  V

  

 
VVV   V
V
V  VV
V    V   V
  V VV   V

V
VreltVV V  VV V V V VV
  V
V
V  VV

V
V  VV
V V   V
  V V V V  VV
 V V V
   VV
V  VV V VV V
V V   V
  VV V
  VV V  V V VV V V  V V V V   V

  V    VV
V  VV
 V V V  V  VV    VV

V
VreltVV
V V V V V
%V

V 
VVV
V V V V  V V V VV VV
V VV
VV VVV
V
 V  V
V 
VVV
VV V V V VVV
V  V VV #V  V  V V VV
 VVV+46389:-V VV
V VV
V V VTV
V m V V VV VV
V
VV

V
VretrVV
V V V V V
%V

V 
VV V    V VVV
VV V V V  V  
V V  VV V
  V VV V  V  V V  VV
V  VV VTaskV
V 
V V V V
V VVT%V
pV 
VV V   VV
V  VV VTV
pV 
VV V    VV
V  VV VTask<T>V
V m V V  VV VV
V
V V

     


1  V V   VV
V  VV V VV V V    V VV

V V   V
  VV V VV  VV V  V V VVV
 V V V V V V    V   V
  V V
%V

0  V V  V    V 9V V  V


V V  VVV VV9V V V  V
   V 8V V  V
V V  VVV VV8V 9V V VV    V V 8V
V V V
 V
VV
 V%V

V EV V VVSV V V   V    V V


VSVVT1V V V
VSVVT2V
V EV V V V   V
  V VT1V V VV    V V VT2V+463;3-V
V EV V V   V
  VT1V V V V VV1VV V  VVV
Expression<1>VT2V V V V VV2VV V  VVVExpression<2>V V
 V
VV
 V%V
pV 1V V VV    V V V2V
pV 1V V2V V   V  V V V V
VV
 V%V
V 1V V V  VVY1V V2V V V  VVY2V V
V  VVXV
 V
VEV VV  V
V V  V V+463898-V VV    V

VXVVY1V VV VV    V
VXVVY2V
V EV V V    V
  V1V V V  VVTask<Y1>V V2V V V
  VVTask<Y2>V V
V  VVTask<X>V V
VEV VV  V

V V  V V+463898-V VV    V
VXVVY1V VV V
V    V
VXVVY2V
V 1V V V  VVYV V2V VvoidV  V

  

  
V
 VV V  VV   V    V
  V V   V   V

c   
 
 î î 
V
â   D

    V
async Task<string> Task<string> red(int p) exatlVtheVaÃeV atreV
Fred(int p) {
{
var $builder = etVaV  lÚerVfrV
a
V
AsyncMethodBuilder<string>.Create();
var $state = 0;
TaskAwaiter<ŝ> $a1; eVÚelarat VfrVeahV
TaskAwaiter $a2; awa t͟Vp tV

Action $resume = null; $resume = delegate V


{
try fVtheVerVhaÚVeteÚVtrV
{ l VtheVweVeVeteÚV
... jump table based on $state
ÃpVta leVaÚVthere͛V
aÚÚ t alVl VVthatVtheV
Ú eVfV f all͟V l VareV
 ppeÚVwhereVapprpr ateV

var x = await e; $a1 = (e).GetAwaiter(); theeVallVareVtVtat V


$state=1; expa VVVtheVfllwVtheV
if ($a1.BeginAwait($resume))
alVrleVfrVerlaÚV
return;
JUMP_LABEL_1: relt VVt͛VaVÃp le-
var x = $a1.EndAwait(); errrVtVawa tVÃeth V fV
theVallVa͛tV eVreleÚV

await s; $a2 = (s).GetAwaiter(); VtheVtateÃetVfrÃVfV


$state=2; awa t͟VtheVÚwa tV
if ($a2.BeginAwait($resume))
ÃethÚV VallweÚVtVretrV
return;
JUMP_LABEL_2:  ÚV
$a2.EndAwait();
throw new Exception(); throw new Exception(); V

return r; $builder.SetResult(r); V
return;
} V
catch (Exception $ex)
{
$builder.SetException($ex);
return;
}
};

$resume(); V
return $builder.Task;
è } V

c   
 
 î 
V
â   D

    V
async Task Fred(int p) Task red(int p) V
{ {
var $builder = AsyncMethodBuilder.Create(); '  lÚeretRelt()V VwV
var $state = 0; paraÃeterleV
TaskAwaiter $a1; V
Action $resume = null; $resume = delegate V
{
try V
{
... jump table based on $state
await s; $a1 = (s).GetAwaiter; V
$state=1;
if ($a1.BeginAwait($resume))
return;
JUMP_LABEL_1:
$a1.EndAwait();
return; $builder.SetResult(); V
return;
} V
catch (Exception $ex)
{
$builder.SetException($ex);
return;
}
$builder.SetResult(); tÃat allV erteÚVatV
theVeÚVfVtheVÚeleateVtV
allwVÃ  VfVexpl  tV
retrVtateÃetV
}; V
$resume(); V
return $builder.Task;
è } V
V

c   
 
   
V

â   D

    V
async void Fred(int p) void red(int p) V
{ {
var $state = 0; V  lÚerV Vth VaeV
TaskAwaiter $a1; V
Action $resume = null; $resume = delegate V
{
... jump table based on $state Vel VtrV l V
await s; $a1 = (s).GetAwaiter(); V
$state=1;
if ($a1.BeginAwait($resume))
return;
JUMP_LABEL_1:
$a1.EndAwait();
return; return; VallVtV'  lÚeretRelt()V
}; VathV l VrV Ãpl  tV
'  lÚeretRelt()VatVtheVeÚV
$resume(); VallVtV'  lÚeret
a ()V
è } V
V