ç§ãã¡ã®ãã¡èª°ãåããªãã®ã§ããïŒ ç§ã¯å®æçã«éåæã³ãŒãã§ãšã©ãŒã«ééããèªåã§ãããè¡ããŸãã ãµã ãµã©ã®ãã®è»èŒªãæ¢ããããã«ãç§ã¯ããªããšæã
æãŸããã®ãéåžžã«é£ãããããã®æãå
žåçãªæšªæ£ãããªããšå
±æããŠããŸãã

ãã®ããã¹ãã¯ãç«¶äºåãéåææ§ããã«ãã¹ã¬ããããã®ä»ã®æãããèšèã«ã€ããŠãã¹ãŠãç¥ã£ãŠããã¹ãã£ãŒãã³ã»ã¯ã©ãªãŒã®ããã°ã«è§ŠçºãããŠããŸãã 圌ã¯ãç«¶åãæ±ãããã®èšå€§ãªæ°ã®ãã¿ãŒã³ãéããã Concurrency in CïŒCookbookããšããæ¬ã®èè
ã§ãã
å€å
žçãªéåæãããããã¯
éåæãããããã¯ãçè§£ããã«ã¯ãawaitããŒã¯ãŒãã䜿çšããŠåŒã³åºãããã¡ãœãããã©ã®ã¹ã¬ãããå®è¡ããããææ¡ãã䟡å€ããããŸãã
ãŸããéåæã®ãœãŒã¹ã«ééãããŸã§ãã¡ãœããã¯éåæã¡ãœããã®åŒã³åºãã®ãã§ãŒã³ãæãäžããŸãã éåæã®ãœãŒã¹ãã©ã®ããã«æ£ç¢ºã«å®è£
ãããŠãããã¯ããã®èšäºã®ç¯å²å€ã®ãããã¯ã§ãã ããã§ãç°¡åã«ããããã«ãããã¯ãçµæïŒããŒã¿ããŒã¹èŠæ±ãHTTPèŠæ±ãªã©ïŒãåŸ
æ©ããŠããéã«ã¯ãŒã¯ãããŒãå¿
èŠãšããªãæäœã§ãããšæ³å®ããŠããŸãã ãã®ãããªæäœã®åæéå§ãšã¯ãã·ã¹ãã ã§çµæãåŸ
æ©ããŠãããšãã«ããªãœãŒã¹ãæ¶è²»ãããæçšãªäœæ¥ãè¡ããªãã¹ãªãŒãã¹ã¬ãããå°ãªããšã1ã€ååšããããšãæå³ããŸãã
éåæåŒã³åºãã§ã¯ãéåææäœã®ãåããšãåŸãã®ã³ãã³ãã®å®è¡ãããŒãäžæããŸãã.NETã§ã¯ãawaitã®åŸã«ããã³ãŒããawaitã®åã®ã³ãŒããšåãã¹ã¬ããã§å®è¡ããããšããä¿èšŒã¯ãããŸããã ã»ãšãã©ã®å Žåãããã¯å¿
èŠãããŸããããããã°ã©ã ãæ©èœããããã«ãã®ãããªåäœãäžå¯æ¬ ãªå Žåã¯ã©ãããã°ããã§ããïŒ SynchronizationContext
ã䜿çšããå¿
èŠããããŸãã ããã¯ãã³ãŒããå®è¡ãããã¹ã¬ããã«ç¹å®ã®å¶éã課ãããšãã§ããã¡ã«ããºã ã§ãã æ¬¡ã«ã2ã€ã®åæã³ã³ããã¹ãïŒ WindowsFormsSynchronizationContext
ããã³AspNetSynchronizationContext
ïŒãAspNetSynchronizationContext
ãŸãããAlex Davisã¯åœŒã®æ¬ã®äžã§.NETã«çŽ12åãããšæžããŠããŸãã SynchronizationContext
ã«ã€ããŠSynchronizationContext
ã ãã ã ãã ãããã³ããã§ããèšè¿°ãããŠãããèè
ã¯ç¬èªã®å®è£
ãè¡ã£ãŠããŸãã
ãã®ãããã³ãŒããéåæã®ãœãŒã¹ã«å°éãããšããã«ã SynchronizationContext.Current
thread-staticããããã£ã«ãã£ãåæã³ã³ããã¹ããä¿åããéåææäœãéå§ããŠçŸåšã®ã¹ã¬ãããè§£æŸããŸãã ã€ãŸããéåææäœã®å®äºãåŸ
æ©ããŠããéãåäžã®ã¹ã¬ããããããã¯ããããšã¯ãããŸãããããã¯ãåææäœãšæ¯èŒããéåææäœã®äž»ãªå©çã§ãã éåææäœã®å®äºåŸãéåæãœãŒã¹ã®åŸã«ããæç€ºã«åŸãå¿
èŠããããŸããããã§ã¯ãéåææäœåŸã«ã³ãŒããå®è¡ããã¹ã¬ãããæ±ºå®ããããã«ã以åã«ä¿åããåæã³ã³ããã¹ãã調ã¹ãå¿
èŠããããŸãã 圌ãèšãããã«ãç§ãã¡ã¯ããããŸãã 圌ã¯ãåŸ
æ©ããåã«ã³ãŒããšåãã¹ã¬ããã§å®è¡ããããã«æç€ºããŸã-ç§ãã¡ã¯åãã¹ã¬ããã§å®è¡ããŸãããèšãããšã¯ãããŸãã-ããŒã«ããæåã®ã¹ã¬ãããååŸããŸãã
ãããããã®ç¹å®ã®ã±ãŒã¹ã§ãawaitã®åŸã®ã³ãŒããã¹ã¬ããããŒã«ã®ç©ºãã¹ã¬ããã§å®è¡ãããããšãéèŠãªå Žåã¯ã©ãã§ããããã ConfigureAwait(false)
ãã³ãã©ConfigureAwait(false)
ã䜿çšããå¿
èŠããããŸãã continueOnCapturedContext
ãã©ã¡ãŒã¿ãŒã«æž¡ãããfalseå€ã¯ãããŒã«ããã®ã¹ã¬ããã䜿çšã§ããããšãã·ã¹ãã ã«äŒããã ãã§ãã ãŸããããšãã°ã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ã®ããã«ãawaitã䜿çšããŠã¡ãœãããå®è¡ãããšãã«ãåæã³ã³ããã¹ãããŸã£ãããªãã£ãå ŽåïŒ SynchronizationContext.Current == null
ïŒãã©ããªããŸããã ãã®å Žåã ConfigureAwait(false)
å Žåã®ããã«ãåŸ
æ©åŸã«ã³ãŒããå®è¡ããã¹ã¬ããã«å¶éã¯ãªããã·ã¹ãã ã¯ããŒã«ããæåã®ã¹ã¬ãããååŸããŸãã
éåæãããããã¯ãšã¯äœã§ããïŒ
WPFããã³WinFormsã®ãããããã¯
WPFã¢ããªã±ãŒã·ã§ã³ãšWinFormsã¢ããªã±ãŒã·ã§ã³ã®éãã¯ãåãåæã³ã³ããã¹ããæã£ãŠããããšã§ãã WPFãšWinFormsã®åæã³ã³ããã¹ãã«ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¹ã¬ãããšããç¹å¥ãªã¹ã¬ããããããŸãã SynchronizationContext
ããšã«1ã€ã®UIã¹ã¬ããã®ã¿ãããããã®ã¹ã¬ããããã®ã¿ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãšå¯Ÿè©±ã§ããŸãã ããã©ã«ãã§ã¯ãUIã¹ã¬ããã§ã®äœæ¥ãéå§ããã³ãŒãã¯ããã®ã¹ã¬ããã§ã®éåææäœã®åŸãæäœãåéããŸãã
次ã«äŸãèŠãŠã¿ãŸãããã
private void Button_Click(object sender, System.Windows.RoutedEventArgs e) { StartWork().Wait(); } private async Task StartWork() { await Task.Delay(100); var s = "Just to illustrate the instruction following await"; }
StartWork().Wait()
ãåŒã³åºããšã©ããªããŸããïŒ
StartWork().Wait()
ïŒ
- åŒã³åºãã¹ã¬ããïŒããã³ããã¯UIã¹ã¬ããïŒã¯ã
StartWork
ã¡ãœããã«StartWork
ã await Task.Delay(100)
åœä»€ã«await Task.Delay(100)
ãŸãã - UIã¹ã¬ããã¯éåæã®
Task.Delay(100)
æäœãéå§ãã Button_Click
ã¡ãœããã«å¶åŸ¡ãè¿ããŸããããã§ã Task
ã¯ã©ã¹ã®Wait()
ã¡ãœããããããåŸ
æ©ããŸãã Wait()
ã¡ãœãããåŒã³åºããããšãUIã¹ã¬ããã¯éåææäœã®çµãããŸã§ãããã¯ãããŸããå®äºãããšããã«ãUIã¹ã¬ããã¯ããã«å®è¡ãéå§ããã³ãŒãã«æ²¿ã£ãŠé²ã¿ãŸããããã¹ãŠããããªãããã§ã¯ãããŸããã Task.Delay(100)
å®äºãããšããã«ãUIã¹ã¬ããã¯ãŸãStartWork()
ã¡ãœããã®å®è¡ãç¶ç¶ããå¿
èŠãããããã®ããã«ã¯å®è¡ãéå§ãããã¹ã¬ãããæ£ç¢ºã«å¿
èŠã§ãã ããããUIã¹ã¬ããã¯çŸåšãæäœã®çµæãåŸ
ã£ãŠããŸããStartWork()
ïŒ StartWork()
ã¯å®è¡ãç¶ç¶ããŠçµæãè¿ãããšãã§ããã Button_Click
ã¯åãçµæãåŸ
ã£ãŠããŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¹ã¬ããã§å®è¡ãéå§ããããšããäºå®ã«ãããã¢ããªã±ãŒã·ã§ã³ã¯åäœãç¶ç¶ããããšãªãåã«ãã³ã°ããŸãã
ãã®ç¶æ³ã¯ã
Task.Delay(100)
ãžã®
Task.Delay(100).ConfigureAwait(false)
ã
Task.Delay(100).ConfigureAwait(false)
倿Žããããšã§ç°¡åã«åŠçã§ããŸãã
private void Button_Click(object sender, System.Windows.RoutedEventArgs e) { StartWork().Wait(); } private async Task StartWork() { await Task.Delay(100).ConfigureAwait(false); var s = "Just to illustrate the instruction following await"; }
ãããã¯ãããUIã¹ã¬ããã§ã¯ãªããããŒã«ã®ã¹ã¬ããã䜿çšããŠStartWork()
ã¡ãœãããå®äºããããšãã§ããããããã®ã³ãŒãã¯ãããããã¯ãªãã§æ©èœããŸãã Stephen Claryã¯ãããã°ã®ãã¹ãŠã®ãã©ã€ãã©ãªã¡ãœãããã§ConfigureAwait(false)
ã䜿çšããããšããå§ããConfigureAwait(false)
ãã ConfigureAwait(false)
ã䜿çšããŠãããããã¯ãåŠçããããšã¯ãå§ãã§ããŸããã 代ããã«ã Wait()
ã Result
ã GetAwaiter().GetResult()
ãªã©ã®ããããã³ã°ã¡ãœããã䜿çšããªãããšããå§ããGetAwaiter().GetResult()
ããã³å¯èœãªå Žåã¯ãéåæ/ Wait()
ã䜿çšããããã«ãã¹ãŠã®ã¡ãœãããGetAwaiter().GetResult()
ãŸãïŒããããAsyncå
šæ¹ååçïŒã
ASP.NETã®ãããããã¯
ASP.NETã«ãåæã³ã³ããã¹ãããããŸããããããã«ç°ãªãå¶éããããŸãã ãªã¯ãšã¹ãããšã«äžåºŠã«1ã€ã®ã¹ã¬ããã®ã¿ã䜿çšã§ããŸãããŸããawaitåŸã®ã³ãŒãã¯ãawaitåã®ã³ãŒããšåãã¹ã¬ããã§å®è¡ããå¿
èŠããããŸãã
äŸïŒ
public class HomeController : Controller { public ActionResult Deadlock() { StartWork().Wait(); return View(); } private async Task StartWork() { await Task.Delay(100); var s = "Just to illustrate the code following await"; } }
ãŸãããã®ã³ãŒãã¯ã StartWork().Wait()
åŒã³åºãæã«ãããããã¯ãåŒãèµ·ãããŸãStartWork().Wait()
èš±å¯ãããŠStartWork().Wait()
å¯äžã®ã¹ã¬ããããããã¯ããã StartWork()
æäœãStartWork()
ãããŸã§åŸ
æ©ããŸããåŸ
ã£ãŠããŸãã
ããã¯ãã¹ãŠåãConfigureAwait(false)
ã«ãã£ãŠä¿®æ£ãããŸãã
ASP.NET Coreã®ãããããã¯ïŒå®éã«ã¯ããã§ã¯ãããŸããïŒ
ããã§ãASP.NET Coreã®ãããžã§ã¯ãã§ASP.NETã®äŸã®ã³ãŒããå®è¡ããŠã¿ãŸãããã ãããè¡ããšããããããã¯ããªãããšãããããŸãã ããã¯ãASP.NET Coreã«åæã³ã³ããã¹ãããªãããã§ãã ãããïŒ ããã§ããããããã¯ãæããããšãªãããããã¯åŒã³åºãã§ã³ãŒããã«ããŒã§ããŸããïŒ å³å¯ã«èšãã°ãã¯ãããã ããããã«ããã¹ã¬ããã¯åŸ
æ©äžã«ã¹ãªãŒãç¶æ
ã«ãªããŸããã€ãŸããã¹ã¬ããã¯ãªãœãŒã¹ãæ¶è²»ããŸãããæçšãªäœæ¥ã¯è¡ããŸããã
ããããã³ã°åŒã³åºãã䜿çšãããšãéåæããã°ã©ãã³ã°ããã¹ãŠã®å©ç¹ãæé€ããŠåæåããããšã«æ³šæããŠãã ãã ã ã¯ãã Wait()
ã䜿çšããªããšããã°ã©ã ãäœæã§ããªãå ŽåããããŸããããã®çç±ã¯é倧ãªãã®ã§ãªããã°ãªããŸããã
Task.RunïŒïŒã®èª€ã£ã䜿çš
Task.Run()
ã¡ãœããã¯ãæ°ããã¹ã¬ããã§æäœãéå§ããããã«äœæãããŸããã TAPãã¿ãŒã³ã§èšè¿°ãããã¡ãœããã«é©ããŠããããã Task
ãŸãã¯Task<T>
ãè¿ããŸããéåæ/ Task.Run()
ã«æåã«ééãã人ã¯ã Task.Run()
ã§åæã³ãŒããã©ãããããã®ã¡ãœããã®çµæã詳ãã調ã¹ãããšåŒ·ãæãã§ããŸãã ã³ãŒãã¯éåæã«ãªã£ãããã«èŠããŸãããå®éã«ã¯äœãå€ãã£ãŠããŸããã ãã®Task.Run()
䜿çšã§äœãèµ·ãããèŠãŠã¿ãŸãããã
äŸïŒ
private static async Task ExecuteOperation() { Console.WriteLine($"Before: {Thread.CurrentThread.ManagedThreadId}"); await Task.Run(() => { Console.WriteLine($"Inside before sleep: {Thread.CurrentThread.ManagedThreadId}"); Thread.Sleep(1000); Console.WriteLine($"Inside after sleep: {Thread.CurrentThread.ManagedThreadId}"); }); Console.WriteLine($"After: {Thread.CurrentThread.ManagedThreadId}"); }
ãã®ã³ãŒãã®çµæã¯æ¬¡ã®ããã«ãªããŸãã
Before: 1 Inside before sleep: 3 Inside after sleep: 3 After: 3
ããã§ã Thread.Sleep(1000)
ã¯ãå®äºããããã«ã¹ã¬ãããå¿
èŠãšããåææäœã®äžçš®ã§ãã ãœãªã¥ãŒã·ã§ã³ãéåæåãããã®æäœã宿¥œæ»ãããããã«ã Task.Run()
ã§ã©ããããããšããŸãã
ã³ãŒããTask.Run()
ã¡ãœããã«å°éãããšããã«ãå¥ã®ã¹ã¬ãããã¹ã¬ããããŒã«ããååŸããã Task.Run()
æž¡ããã³ãŒããå®è¡ãããŸãã é©åãªã¹ã¬ããã«ãµããããå€ãã¹ã¬ããã¯ãããŒã«ã«æ»ããäœæ¥ãå®è¡ããããã«å床åŒã³åºãããã®ãåŸ
ã¡ãŸãã æ°ããã¹ã¬ããã¯éä¿¡ãããã³ãŒããå®è¡ããåææäœã«å°éããåæçã«å®è¡ãïŒæäœãå®äºãããŸã§åŸ
æ©ãïŒãã³ãŒãã«æ²¿ã£ãŠããã«é²ã¿ãŸãã ã€ãŸããæäœã¯åæãç¶æããŸããã以åãšåæ§ã«ãåææäœã®å®è¡äžã«ã¹ããªãŒã ã䜿çšããŸãã å¯äžã®éãã¯ã Task.Run()
ãåŒã³åºããŠExecuteOperation()
æ»ããšãã«ã³ã³ããã¹ãã®åãæ¿ãã«æéãè²»ãããããšExecuteOperation()
ã ãã¹ãŠãå°ãæªããªããŸããã
Inside after sleep: 3
ããã³After: 3
ã§ã¯åãIdã®ã¹ããªãŒã ã衚瀺ããããšããäºå®ã«ãããããããå®è¡ã³ã³ããã¹ãã¯ãããã®å Žæã§å®å
šã«ç°ãªãããšãçè§£ããå¿
èŠããããŸãã ASP.NETã¯ãç§ãã¡ãããè³¢ããã³ã³ããã¹ããTask.Run()
å
ã®ã³ãŒãããå€éšã³ãŒãã«åãæ¿ãããšãã«ãªãœãŒã¹ãç¯çŽããããšããŸãã ããã§ã圌ã¯å°ãªããšãå®è¡ã®æµããå€ããªãããšã«æ±ºããŸããã
ãã®ãããªå Žåã Task.Run()
ã䜿çšããŠãæå³ããããŸããã 代ããã«ãClary ã¯ãã¹ãŠã®æäœãéåæã«ããããšãThread.Sleep(1000)
ããŸããã€ãŸãããã®å Žåã Thread.Sleep(1000)
ãTask.Delay(1000)
ã«çœ®ãæããããšããThread.Sleep(1000)
ããŸããããã¡ãããããåžžã«å¯èœã§ãããšã¯éããŸããã æžãçŽããªãããŸãã¯æåŸãŸã§éåæã«ããããªããµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããå Žåãã©ãããã°ããã®ã§ããããïŒäœããã®çç±ã§éåæã¡ãœãããå¿
èŠã§ããïŒ Task.FromResult()
ã䜿çšããŠããã³ããŒã¡ãœããã®çµæãTaskã«ã©ããããããšããTask.FromResult()
ããŸãã ãã¡ãããããã«ããã³ãŒãã¯éåæã«ãªããŸããããå°ãªããšãã³ã³ããã¹ãã®åãæ¿ãã¯ç¯çŽã§ããŸãã
ãªãTask.RunïŒïŒã䜿çšããã®ã§ããïŒ çãã¯ç°¡åã§ããCPUã«ãã€ã³ããããæäœã§ã¯ãUIã®å¿çæ§ãç¶æããããèšç®ã䞊ååãããããå¿
èŠããããŸãã ããã§ãCPUããŠã³ãæäœã¯æ¬è³ªçã«åæã§ãããšèšããªããã°ãªããŸããã Task.Run()
ãçºæãããã®ã¯ãéåæã¹ã¿ã€ã«ã§åææäœãéå§ããããšTask.Run()
ã
éåæãã€ãã®èª€çš
éåæã€ãã³ããã³ãã©ãèšè¿°ããããã«ã
void
è¿ãéåæã¡ãœãããèšè¿°ããæ©èœã远å ãããŸããã ä»ã®ç®çã§äœ¿çšãããå Žåã«æ··ä¹±ãåŒãèµ·ããçç±ãèŠãŠã¿ãŸãããã
- çµæãåŸ
ã€ããšã¯ã§ããŸããã
- try-catchã«ããäŸå€åŠçã¯ãµããŒããããŠããŸããã
Task.WhenAll()
ã Task.WhenAny()
ããã³ä»ã®åæ§ã®ã¡ãœããã䜿çšããŠåŒã³åºããçµåããããšã¯äžå¯èœã§ãã
ããããã¹ãŠã®çç±ã®äžã§ãæãè峿·±ãç¹ã¯äŸå€ã®åŠçã§ãã å®éã Task
ãŸãã¯Task<T>
ãè¿ãéåæã¡ãœããã§ã¯ãäŸå€ããã£ãããããŠTask
ãªããžã§ã¯ãã«ã©ãããããåŒã³åºãå
ã®ã¡ãœããã«æž¡ãããŸãã MSDNã®èšäºã§ Claryã¯ãasync-voidã¡ãœããã«ã¯æ»ãå€ããªããããäŸå€ãã¹ããŒãããã®ã¯ãªããåæã®ã³ã³ããã¹ãã§çŽæ¥ã¹ããŒããããšæžããŠããŸãã ãã®çµæãåŠçãããªãäŸå€ãçºçããããã»ã¹ãã¯ã©ãã·ã¥ããããããã³ã³ãœãŒã«ã«ãšã©ãŒãæžã蟌ãæéããããŸãã AppDomain.UnhandledException
ã€ãã³ãã«ãµãã¹ã¯ã©ã€ãããããšã«ããããã®ãããªäŸå€ãååŸããã³äºçŽã§ããŸããããã®ã€ãã³ãã®ãã³ãã©ãŒã§ãããã»ã¹ã®ã¯ã©ãã·ã¥ã忢ããããšã¯ã§ããŸããã ãã®æ¯ãèãã¯ãã€ãã³ããã³ãã©ãŒã ãã®å
žåçãªãã®ã§ãããtry-catchãä»ããæšæºã®äŸå€åŠçã®å¯èœæ§ãäºæ³ãããéåžžã®ã¡ãœããã§ã¯ãããŸããã
ããšãã°ãASP.NET Coreã¢ããªã±ãŒã·ã§ã³ã§æ¬¡ã®ããã«èšè¿°ããå Žåãããã»ã¹ã¯ç¢ºå®ã«å€±æããŸãã
public IActionResult ThrowInAsyncVoid() { ThrowAsynchronously(); return View(); } private async void ThrowAsynchronously() { throw new Exception("Obviously, something happened"); }
ãã ãã ThrowAsynchronously
ã¡ãœããã®æ»ãå€ã®åãïŒawaitããŒã¯ãŒãã远å ããããšãªãïŒ Task
倿Žããããšã¯äŸ¡å€ããããäŸå€ã¯æšæºã®ASP.NET Coreãšã©ãŒãã³ãã©ãŒã«ãã£ãŠãã£ãããããããã»ã¹ã¯å®è¡ãããŠãåäœãç¶ããŸãã
async-voidã¡ãœããã«æ³šæããŠãã ãã -ãããã¯ããã»ã¹ã«ããªãã眮ãããšãã§ããŸãã
åç·æ¹åŒã§åŸ
ã€
æåŸã®ã¢ã³ããã¿ãŒã³ã¯ã以åã®ã¢ã³ããã¿ãŒã³ã»ã©æãã¯ãããŸããã äžçªäžã®è¡ã¯ãããšãã°ã awaitã䜿çšããå Žåã®äŸå€ãé€ããŠãå¥ã®éåæã¡ãœããã®çµæãããã«åçŽã«è»¢éããã¡ãœããã§async / awaitã䜿çšããæå³ããªãããšã§ãã
ãã®ã³ãŒãã®ä»£ããã«ïŒ
public async Task MyMethodAsync() { await Task.Delay(1000); }
以äžãæžãããšã¯å®å
šã«å¯èœã§ãïŒã§ããã°ïŒã
public Task MyMethodAsync() { return Task.Delay(1000); }
ãªãæ©èœããã®ã§ããïŒ awaitããŒã¯ãŒãã¯Taskã®ãããªãªããžã§ã¯ãã«é©çšã§ããasyncããŒã¯ãŒãã§ããŒã¯ãããã¡ãœããã«ã¯é©çšã§ããªãããã§ãã æ¬¡ã«ãasyncããŒã¯ãŒãã¯ããã®ã¡ãœãããã¹ããŒããã·ã³ã«å±éããå¿
èŠãããããšãã³ã³ãã€ã©ã«äŒãã Task
ïŒãŸãã¯å¥ã®ã¿ã¹ã¯ã®ãããªãªããžã§ã¯ãïŒã®ãã¹ãŠã®æ»ãå€ãã©ããããŸãã
èšãæãããšãã¡ãœããã®æåã®ããŒãžã§ã³ã®çµæã¯Task
ã§ããã Task.Delay(1000)
åŸ
æ©ãCompleted
ãšããã«Completed
ããã¡ãœããã®2çªç®ã®ããŒãžã§ã³ã®çµæã¯Task
ã Task.Delay(1000)
ã«ãã£ãŠè¿ãããŸãã ã
ã芧ã®ãšãããäž¡æ¹ã®ããŒãžã§ã³ã¯åçã§ãããåæã«ãæåã®ããŒãžã§ã³ã¯éåæã®ãããã£ãããããäœæããããã«ããå€ãã®ãªãœãŒã¹ãå¿
èŠãšããŸãã
Alex Davisã¯ãéåæã¡ãœãããçŽæ¥åŒã³åºãã³ã¹ãã¯ãåæã¡ãœãããåŒã³åºãã³ã¹ãã®10åã«ãªãå¯èœæ§ããããšæžããŠããã®ã§ã詊ãã¹ãããšããããŸãã
UPDïŒã³ã¡ã³ããæ£ããææããŠããããã«ãåäžè¡ã®ã¡ãœããããéåæ/åŸ
æ©ãèŠãå Žåãæªåœ±é¿ãçããŸãã ããšãã°ãäŸå€ãã¹ããŒããå Žåãã¿ã¹ã¯ãã¹ããŒããã¡ãœããã¯ã¹ã¿ãã¯ã«è¡šç€ºãããŸããã ãããã£ãŠã
ããã©ã«ãã§ã¯ããã©ã«ããåé€ããããšã¯ãå§ãããŸãã ã è§£æã䌎ã
Claryã®æçš¿ ã