Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
Task éåæããã°ã©ãã³ã° (TAP) ã¢ãã«ã¯ãäžè¬çãªéåæã³ãŒãã£ã³ã°ãããæœè±¡åã®ã¬ã€ã€ãŒãæäŸããŸãã ãã®ã¢ãã«ã§ã¯ãéåžžãšåãããã«ãã¹ããŒãã¡ã³ãã®ã·ãŒã±ã³ã¹ãšããŠã³ãŒããèšè¿°ããŸãã éãã¯ãã³ã³ãã€ã©ãåã¹ããŒãã¡ã³ããåŠçããæ¬¡ã®ã¹ããŒãã¡ã³ãã®åŠçãéå§ããåã«ãã¿ã¹ã¯ ããŒã¹ã®ã³ãŒããèªã¿åãããšãã§ããç¹ã§ãã ãã®ã¢ãã«ãå®çŸããããã«ãã³ã³ãã€ã©ã¯å€ãã®å€æãå®è¡ããŠåã¿ã¹ã¯ãå®äºããŸãã äžéšã®ã¹ããŒãã¡ã³ãã§ã¯ãäœæ¥ãéå§ããé²è¡äžã®äœæ¥ã衚ã Task ãªããžã§ã¯ããè¿ãããšãã§ããŸãã ã³ã³ãã€ã©ã¯ãããã®å€æã解決ããå¿ èŠããããŸãã ã¿ã¹ã¯éåæããã°ã©ãã³ã°ã®ç®çã¯ãã¹ããŒãã¡ã³ãã®ã·ãŒã±ã³ã¹ã®ããã«èªã¿åãããããè€éãªé åºã§å®è¡ãããã³ãŒããæå¹ã«ããããšã§ãã å®è¡ã¯ãå€éšãªãœãŒã¹ã®å²ãåœãŠãšã¿ã¹ã¯ã®å®äºã«åºã¥ããŠããŸãã
ã¿ã¹ã¯éåæããã°ã©ãã³ã° ã¢ãã«ã¯ãéåæã¿ã¹ã¯ãå«ãããã»ã¹ã®æç€ºããŠãŒã¶ãŒãè¡ãæ¹æ³ã«äŒŒãŠããŸãã ãã®èšäºã§ã¯ãæé£ãäœæããæé ã®äŸã䜿çšããŠã Async ããŒã¯ãŒããš Await ããŒã¯ãŒãã䜿çšããŠãäžé£ã®éåæåœä»€ãå«ãã³ãŒããç°¡åã«æšè«ã§ããããã«ããæ¹æ³ã瀺ããŸãã æé£ãäœãæé ã¯ãäžèЧãšããŠæäŸãããå ŽåããããŸãã
- ã³ãŒããŒãäžæ¯æ³šããŸãã
- ãã©ã€ãã³ãç±ãã2åã®åµãæããŸãã
- 3ã€ã®ããã·ã¥ãã©ãŠã³ã®ããã調çããŸãã
- 2 æã®ãã³ãããŒã¹ãããŸãã
- ããŒã¹ãã«ãã¿ãŒãšãžã£ã ãåºããŸãã
- ãªã¬ã³ãžãžã¥ãŒã¹ã1æ¯æ³šããŸãã
調çã®çµéšãããå Žåã¯ããããã®æé ã éåæçã«å®äºã§ããŸãã ããªãã¯åµã®ããã«ãã³ãæž©ãå§ããããã·ã¥ãã©ãŠã³ã調çãå§ããŸãã ããªãã¯ããŒã¹ã¿ãŒã«ãã³ãå ¥ããŠãåµã調çãå§ããŸãã ããã»ã¹ã®åã¹ãããã§ããŸãã¿ã¹ã¯ãéå§ãããã®åŸã泚æãæãæºåãæŽã£ãä»ã®ã¿ã¹ã¯ã«ç§»è¡ããŸãã
æé£ã®èª¿çã¯ã䞊åã§ã¯ãªãéåæäœæ¥ã®è¯ãäŸã§ãã 1 人ã®ãŠãŒã¶ãŒ (ãŸãã¯ã¹ã¬ãã) ããã¹ãŠã®ã¿ã¹ã¯ãåŠçã§ããŸãã åã®ã¿ã¹ã¯ãå®äºããåã«æ¬¡ã®ã¿ã¹ã¯ãéå§ããããšã§ã1 人ã®ãŠãŒã¶ãŒãæé£ãéåæçã«è¡ãããšãã§ããŸãã 誰ããããã»ã¹ãç©æ¥µçã«èŠãŠãããã©ããã«é¢ä¿ãªããå調çã¿ã¹ã¯ãé²è¡ããŸãã åµã®éãæž©ãå§ãããšããã«ãããã·ã¥ãã©ãŠã³ã®èª¿çãå§ããããšãã§ããŸãã ããã·ã¥ãã©ãŠã³ã調çãå§ããããããŒã¹ã¿ãŒã«ãã³ãå ¥ããããšãã§ããŸãã
䞊åã¢ã«ãŽãªãºã ã®å Žåã¯ã調çããè€æ°ã®ãŠãŒã¶ãŒ (ãŸãã¯è€æ°ã®ã¹ã¬ãã) ãå¿ èŠã§ãã ãã人ãåµã調çããå¥ã®äººãããã·ã¥ãã©ãŠã³ã調çããŸãã åãŠãŒã¶ãŒã¯ã1 ã€ã®ç¹å®ã®ã¿ã¹ã¯ã«çŠç¹ãåœãŠãŸãã 調çäžã®å人 (ãŸãã¯åã¹ã¬ãã) ã¯ãçŸåšã®ã¿ã¹ã¯ã®å®äºãåæçã«åŸ æ©ããŠãããã¯ãããŸã (ã²ã£ããè¿ãæºåãã§ããŠããããã·ã¥ãã©ãŠã³ãããŒã¹ã¿ãŒã§çŒãæºåãã§ããŠãããã³ãªã©)ã
Visual Basic ã³ãŒã ã¹ããŒãã¡ã³ããšããŠèšè¿°ãããåæåœä»€ã®åãäžèЧãèããŠã¿ãŸãããã
Sub Main()
Dim cup As Coffee = PourCoffee()
Console.WriteLine("coffee is ready")
Dim eggs As Egg = FryEggs(2)
Console.WriteLine("eggs are ready")
Dim hashBrown As HashBrown = FryHashBrowns(3)
Console.WriteLine("hash browns are ready")
Dim toast As Toast = ToastBread(2)
ApplyButter(toast)
ApplyJam(toast)
Console.WriteLine("toast is ready")
Dim oj As Juice = PourOJ()
Console.WriteLine("oj is ready")
Console.WriteLine("Breakfast is ready!")
End Sub
Private Function PourOJ() As Juice
Console.WriteLine("Pouring orange juice")
Return New Juice()
End Function
Private Sub ApplyJam(toast As Toast)
Console.WriteLine("Putting jam on the toast")
End Sub
Private Sub ApplyButter(toast As Toast)
Console.WriteLine("Putting butter on the toast")
End Sub
Private Function ToastBread(slices As Integer) As Toast
For slice As Integer = 0 To slices - 1
Console.WriteLine("Putting a slice of bread in the toaster")
Next
Console.WriteLine("Start toasting...")
Task.Delay(3000).Wait()
Console.WriteLine("Remove toast from toaster")
Return New Toast()
End Function
Private Function FryHashBrowns(patties As Integer) As HashBrown
Console.WriteLine($"putting {patties} hash brown patties in the pan")
Console.WriteLine("cooking first side of hash browns...")
Task.Delay(3000).Wait()
For patty As Integer = 0 To patties - 1
Console.WriteLine("flipping a hash brown patty")
Next
Console.WriteLine("cooking the second side of hash browns...")
Task.Delay(3000).Wait()
Console.WriteLine("Put hash browns on plate")
Return New HashBrown()
End Function
Private Function FryEggs(howMany As Integer) As Egg
Console.WriteLine("Warming the egg pan...")
Task.Delay(3000).Wait()
Console.WriteLine($"cracking {howMany} eggs")
Console.WriteLine("cooking the eggs ...")
Task.Delay(3000).Wait()
Console.WriteLine("Put eggs on plate")
Return New Egg()
End Function
Private Function PourCoffee() As Coffee
Console.WriteLine("Pouring coffee")
Return New Coffee()
End Function
äžèšã®ã³ãŒããèªåã§è©Šãå Žåã¯ã次ã®è¿œå ã®åãå®çŸ©ããå¿ èŠããããŸãã
Friend Class HashBrown
End Class
Friend Class Coffee
End Class
Friend Class Egg
End Class
Friend Class Juice
End Class
Friend Class Toast
End Class
ãããã®æé ãã³ã³ãã¥ãŒã¿ãŒãšããŠè§£éããå Žåãæé£ã®æºåã«ã¯çŽ 30 åããããŸãã æéã¯ãåã ã®ã¿ã¹ã¯æéã®åèšã§ãã ã³ã³ãã¥ãŒã¿ãŒã¯ããã¹ãŠã®äœæ¥ãå®äºãããŸã§åã¹ããŒãã¡ã³ãããããã¯ããæ¬¡ã®ã¿ã¹ã¯ ã¹ããŒãã¡ã³ãã«é²ã¿ãŸãã ãã®æ¹æ³ã«ã¯æéããããå ŽåããããŸãã æé£ã®äŸã§ã¯ãã³ã³ãã¥ãŒã¿ãŒ ã¡ãœããã«ãã£ãŠæºè¶³ã§ããªãæé£ãäœæãããŸãã åæãªã¹ãã®åŸã®ã¿ã¹ã¯ (ãã³ã®ããŒã¹ããªã©) ã¯ãåã®ã¿ã¹ã¯ãå®äºãããŸã§éå§ãããŸããã æé£ã®æºåãæŽãåã«ãäžéšã®é£ã¹ç©ãå·ãããªããŸãã
ã³ã³ãã¥ãŒã¿ãŒã§åœä»€ãéåæçã«å®è¡ããå Žåã¯ãéåæã³ãŒããèšè¿°ããå¿ èŠããããŸãã ã¯ã©ã€ã¢ã³ã ããã°ã©ã ãèšè¿°ãããšãã«ãUI ããŠãŒã¶ãŒå ¥åã«å¯ŸããŠå¿çæ§ãæããããã Web ããããŒã¿ãããŠã³ããŒãããéã«ãã¢ããªã±ãŒã·ã§ã³ã§ãã¹ãŠã®å¯Ÿè©±ãããªãŒãºãããã¹ãã§ã¯ãããŸããã ãµãŒã㌠ããã°ã©ã ãèšè¿°ãããšãã¯ãä»ã®èŠæ±ãåŠçããŠããå¯èœæ§ã®ããã¹ã¬ããããããã¯ããããªãå ŽåããããŸãã éåæã®ä»£æ¿ææ®µãããå Žåã«åæã³ãŒãã䜿çšãããšãã³ã¹ããæããŠã¹ã±ãŒã«ã¢ãŠãããèœåãæãªãããŸãã ãããã¯ãããã¹ã¬ããã«å¯ŸããŠæ¯æããŸãã
æåããææ°ã®ã¢ããªã«ã¯éåæã³ãŒããå¿ èŠã§ãã èšèªããµããŒããããŠããªãå Žåãéåæã³ãŒããèšè¿°ããã«ã¯ãã³ãŒã«ããã¯ãå®äºã€ãã³ãããŸãã¯ãã®ä»ã®ææ®µãå¿ èŠã§ããããã«ãããã³ãŒãã®å ã®æå³ãé ãããŸãã åæã³ãŒãã®å©ç¹ã¯ãã¹ãã£ã³ãšçè§£ã容æã«ããã¹ããã ã〠ã¹ãããã¢ã¯ã·ã§ã³ã§ãã åŸæ¥ã®éåæã¢ãã«ã§ã¯ãã³ãŒãã®åºæ¬çãªã¢ã¯ã·ã§ã³ã§ã¯ãªããã³ãŒãã®éåæã®æ§è³ªã«éç¹ã眮ãå¿ èŠããããŸãã
ãããã¯ããªãã代ããã«åŸ æ©ãã
åã®ã³ãŒãã§ã¯ãæ®å¿µãªããã°ã©ãã³ã°ææ³ã§ããéåææäœãå®è¡ããããã®åæã³ãŒãã®èšè¿°ã匷調ãããŠããŸãã ãã®ã³ãŒãã¯ãçŸåšã®ã¹ã¬ãããä»ã®äœæ¥ãè¡ãããšããããã¯ããŸãã å®è¡äžã®ã¿ã¹ã¯ãããéãã³ãŒãã¯ã¹ã¬ãããäžæããŸããã ãã®ã¢ãã«ã®çµæã¯ããã³ãå ¥ããåŸã«ããŒã¹ã¿ãŒãèŠã€ããã®ãšäŒŒãŠããŸãã äžæã¯ç¡èŠãããã³ããããã¢ãããããŸã§ä»ã®ã¿ã¹ã¯ãéå§ããŸããã ããªãã¯ãã¿ãŒãšãžã£ã ãå·èµåº«ããåãåºããŸããã ã¹ããŒãããç«ãåºãã®ãèŠéããããããŸããã ãã³ãããŒã¹ãããä»ã®æžå¿µäºé ãåæã«åŠçããå¿ èŠããããŸãã ããã¯ãã³ãŒãã«ãåœãŠã¯ãŸããŸãã
ãŸããã¿ã¹ã¯ã®å®è¡äžã«ã¹ã¬ããããããã¯ãããªãããã«ã³ãŒããæŽæ°ããŸãã
Await ããŒã¯ãŒãã¯ãã¿ã¹ã¯ãéå§ããã¿ã¹ã¯ã®å®äºæã«å®è¡ãç¶è¡ããéããããã³ã°ã®æ¹æ³ãæäŸããŸãã æé£ã³ãŒãã®åçŽãªéåæããŒãžã§ã³ã¯ã次ã®ã¹ããããã®ããã«ãªããŸãã
Module AsyncBreakfastProgram
Async Function Main() As Task
Dim cup As Coffee = PourCoffee()
Console.WriteLine("coffee is ready")
Dim eggs As Egg = Await FryEggsAsync(2)
Console.WriteLine("eggs are ready")
Dim hashBrown As HashBrown = Await FryHashBrownsAsync(3)
Console.WriteLine("hash browns are ready")
Dim toast As Toast = Await ToastBreadAsync(2)
ApplyButter(toast)
ApplyJam(toast)
Console.WriteLine("toast is ready")
Dim oj As Juice = PourOJ()
Console.WriteLine("oj is ready")
Console.WriteLine("Breakfast is ready!")
End Function
Private Async Function ToastBreadAsync(slices As Integer) As Task(Of Toast)
For slice As Integer = 0 To slices - 1
Console.WriteLine("Putting a slice of bread in the toaster")
Next
Console.WriteLine("Start toasting...")
Await Task.Delay(3000)
Console.WriteLine("Remove toast from toaster")
Return New Toast()
End Function
Private Async Function FryHashBrownsAsync(patties As Integer) As Task(Of HashBrown)
Console.WriteLine($"putting {patties} hash brown patties in the pan")
Console.WriteLine("cooking first side of hash browns...")
Await Task.Delay(3000)
For patty As Integer = 0 To patties - 1
Console.WriteLine("flipping a hash brown patty")
Next
Console.WriteLine("cooking the second side of hash browns...")
Await Task.Delay(3000)
Console.WriteLine("Put hash browns on plate")
Return New HashBrown()
End Function
Private Async Function FryEggsAsync(howMany As Integer) As Task(Of Egg)
Console.WriteLine("Warming the egg pan...")
Await Task.Delay(3000)
Console.WriteLine($"cracking {howMany} eggs")
Console.WriteLine("cooking the eggs ...")
Await Task.Delay(3000)
Console.WriteLine("Put eggs on plate")
Return New Egg()
End Function
Private Function PourCoffee() As Coffee
Console.WriteLine("Pouring coffee")
Return New Coffee()
End Function
Private Function PourOJ() As Juice
Console.WriteLine("Pouring orange juice")
Return New Juice()
End Function
Private Sub ApplyJam(toast As Toast)
Console.WriteLine("Putting jam on the toast")
End Sub
Private Sub ApplyButter(toast As Toast)
Console.WriteLine("Putting butter on the toast")
End Sub
End Module
ãã®ã³ãŒãã¯ã FryEggsã FryHashBrownsãããã³ ToastBread ã®å
ã®ã¡ãœããæ¬äœãæŽæ°ããŠã Task(Of Egg)ã Task(Of HashBrown)ãããã³ Task(Of Toast) ãªããžã§ã¯ããããããè¿ããŸãã æŽæ°ãããã¡ãœããåã«ã¯ã"Async" ãµãã£ãã¯ã¹ ( FryEggsAsyncã FryHashBrownsAsyncãããã³ ToastBreadAsync) ãå«ãŸããŸãã
Main颿°ã¯ãTask ãªããžã§ã¯ããè¿ããŸãããReturnåŒã¯èšèšãããŠããŸããã
泚
æŽæ°ãããã³ãŒãã§ã¯ãéåæããã°ã©ãã³ã°ã®äž»ãªæ©èœããŸã å©çšããŠããªããããå®äºæéãçããªãå¯èœæ§ããããŸãã ãã®ã³ãŒãã¯ãåæåæããŒãžã§ã³ãšã»ãŒåãæéã§ã¿ã¹ã¯ãåŠçããŸãã ã¡ãœããã®å®å šãªå®è£ ã«ã€ããŠã¯ããã®èšäºã§åŸè¿°ããã³ãŒãã®æçµããŒãžã§ã³ãåç §ããŠãã ããã
æŽæ°ãããã³ãŒãã«æé£ã®äŸãé©çšããŠã¿ãŸãããã åµãŸãã¯ããã·ã¥ãã©ãŠã³ã調çãããŠããéãã¹ã¬ããã¯ãããã¯ãããŸããããã³ãŒãã¯çŸåšã®äœæ¥ãå®äºãããŸã§ä»ã®ã¿ã¹ã¯ãéå§ããŸããã ããªãã¯ãŸã ããŒã¹ã¿ãŒã«ãã³ãå ¥ããŠããã³ããããã¢ãããããŸã§ããŒã¹ã¿ãŒãèŠã€ããŸãããä»ã§ã¯äžæã«å¯Ÿå¿ããããšãã§ããŸãã è€æ°ã®æ³šæãè¡ãããã¬ã¹ãã©ã³ã§ã¯ãå¥ã®æçãæ¢ã«èª¿çãããŠããéã«ãæçäººã¯æ°ããæ³šæãéå§ã§ããŸãã
æŽæ°ãããã³ãŒãã§ã¯ãæé£ã«å¯ŸããŠäœæ¥ããŠããã¹ã¬ããã¯ãæªå®äºã®éå§ã¿ã¹ã¯ãåŸ æ©ããŠããéã¯ãããã¯ãããŸããã äžéšã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã®å€æŽã ãã§ååã§ãã Web ããã®ããŒã¿ã®ããŠã³ããŒãäžã«ãŠãŒã¶ãŒã®æäœããµããŒãããããã«ã¢ããªãæå¹ã«ããããšãã§ããŸãã ä»ã®ã·ããªãªã§ã¯ãåã®ã¿ã¹ã¯ãå®äºããã®ãåŸ ã£ãŠããéã«ä»ã®ã¿ã¹ã¯ãéå§ã§ããŸãã
ã¿ã¹ã¯ãåæã«éå§ãã
ã»ãšãã©ã®æäœã§ã¯ãè€æ°ã®ç¬ç«ããã¿ã¹ã¯ãããã«éå§ã§ããŸãã åã¿ã¹ã¯ãå®äºããããéå§ããæºåãã§ããŠããä»ã®äœæ¥ãéå§ã§ããŸãã ãã®ææ³ãæé£ã®äŸã«é©çšãããšãæé£ãããè¿ éã«æºåã§ããŸãã ãŸããåãæéã«è¿ãæºåãã§ããã®ã§ãããããã¬ãã¯ãã¡ãŒã¹ããæ¥œããããšãã§ããŸãã
Task ã¯ã©ã¹ãšé¢é£ããåã䜿çšããŠãé²è¡äžã®ã¿ã¹ã¯ã«ãã®ã¹ã¿ã€ã«ã®æšè«ãé©çšããŸãã ãã®æ¹æ³ã§ã¯ãå®éã®æé£ã®äœææ¹æ³ã«äŒŒãã³ãŒããèšè¿°ã§ããŸãã åµãããã·ã¥ãã©ãŠã³ãããŒã¹ããåæã«èª¿çãå§ããŸãã åé£åã«ã¢ã¯ã·ã§ã³ãå¿ èŠãªå Žåã¯ããã®ã¿ã¹ã¯ã«æ³šæãåããã¢ã¯ã·ã§ã³ã®åŠçãè¡ããæ³šæãå¿ èŠãªä»ã®åŠçãåŸ ã¡ãŸãã
ã³ãŒãã§ã¿ã¹ã¯ãéå§ããäœæ¥ã衚ã Task ãªããžã§ã¯ããä¿æããŸãã ã¿ã¹ã¯ã® Await åŒã䜿çšããŠãçµæãæºåã§ãããŸã§åŠçãé
ãããŸãã
ãããã®å€æŽãæé£ã³ãŒãã«é©çšããŸãã æåã®æé ã§ã¯ã Await åŒã䜿çšããã®ã§ã¯ãªããæäœã®éå§æã«ã¿ã¹ã¯ãæ ŒçŽããŸãã
Dim cup As Coffee = PourCoffee()
Console.WriteLine("Coffee is ready")
Dim eggsTask As Task(Of Egg) = FryEggsAsync(2)
Dim eggs As Egg = Await eggsTask
Console.WriteLine("Eggs are ready")
Dim hashBrownTask As Task(Of HashBrown) = FryHashBrownsAsync(3)
Dim hashBrown As HashBrown = Await hashBrownTask
Console.WriteLine("Hash browns are ready")
Dim toastTask As Task(Of Toast) = ToastBreadAsync(2)
Dim toast As Toast = Await toastTask
ApplyButter(toast)
ApplyJam(toast)
Console.WriteLine("Toast is ready")
Dim oj As Juice = PourOJ()
Console.WriteLine("Oj is ready")
Console.WriteLine("Breakfast is ready!")
ãããã®å€æŽã¯ãæé£ã®æºåãæ©ããã®ã«åœ¹ç«ã€ããã§ã¯ãããŸããã
AwaitåŒã¯ãéå§ãããšããã«ãã¹ãŠã®ã¿ã¹ã¯ã«é©çšãããŸãã æ¬¡ã®æé ã§ã¯ãæé£ãæäŸããåã«ãããã·ã¥ ãã©ãŠã³ãšåµã® Await åŒãã¡ãœããã®æåŸã«ç§»åããŸãã
Dim cup As Coffee = PourCoffee()
Console.WriteLine("Coffee is ready")
Dim eggsTask As Task(Of Egg) = FryEggsAsync(2)
Dim hashBrownTask As Task(Of HashBrown) = FryHashBrownsAsync(3)
Dim toastTask As Task(Of Toast) = ToastBreadAsync(2)
Dim toast As Toast = Await toastTask
ApplyButter(toast)
ApplyJam(toast)
Console.WriteLine("Toast is ready")
Dim oj As Juice = PourOJ()
Console.WriteLine("Oj is ready")
Dim eggs As Egg = Await eggsTask
Console.WriteLine("Eggs are ready")
Dim hashBrown As HashBrown = Await hashBrownTask
Console.WriteLine("Hash browns are ready")
Console.WriteLine("Breakfast is ready!")
ããã§ãæºåã«çŽ 20 åãããéåæã®æé£ãçšæãããŸããã äžéšã®ã¿ã¹ã¯ã¯åæã«å®è¡ããããããåèšã¯ãã¯æéãççž®ãããŸãã
ã³ãŒãã®æŽæ°ã§ã¯ã調çæéãççž®ããããšã§æºåããã»ã¹ãåäžããŸãããåµãšããã·ã¥ ãã©ãŠã³ãçŒãããšã§ååž°ãçºçããŸãã ãã¹ãŠã®éåæã¿ã¹ã¯ãäžåºŠã«éå§ããŸãã å¿
èŠãªãšãã®ã¿ãã¿ã¹ã¯ã®çµæãåŸ
æ©ããŸãã ã³ãŒãã¯ãç°ãªããã€ã¯ããµãŒãã¹ã«èŠæ±ãè¡ããçµæã 1 ã€ã®ããŒãžã«çµåãã Web ã¢ããªã±ãŒã·ã§ã³ã®ããã°ã©ã ã«äŒŒãŠããå ŽåããããŸãã ãã¹ãŠã®èŠæ±ãããã«è¡ãããããã®ãã¹ãŠã®ã¿ã¹ã¯ã« Await åŒãé©çšããWeb ããŒãžãäœæããŸãã
ã¿ã¹ã¯ãéããŠæ§æããµããŒããã
åã®ã³ãŒããªããžã§ã³ã¯ãããŒã¹ããé€ããæé£ã®æºåãåæã«è¡ãã®ã«åœ¹ç«ã¡ãŸãã ããŒã¹ããäœæããããã»ã¹ã¯ãåææäœ (ããŒã¹ãã«ãã¿ãŒãšãžã£ã ãåºãã) ã䌎ãéåææäœ (ãã³ã®ããŒã¹ã) ã® æ§æ ã§ãã ãã®äŸã§ã¯ãéåæããã°ã©ãã³ã°ã«é¢ããéèŠãªæŠå¿µã瀺ããŸãã
Important
éåææäœãšããã«ç¶ãåæåŠçã®æ§æã¯ãéåææäœã§ãã å¥ã®æ¹æ³ã§è¿°ã¹ãããã«ãæäœã®äžéšãéåæã®å Žåãæäœå šäœãéåæã«ãªããŸãã
以åã®æŽæ°ã§ã¯ãå®è¡äžã®ã¿ã¹ã¯ãä¿æããããã« Task ãŸã㯠Task<TResult> ãªããžã§ã¯ãã䜿çšããæ¹æ³ã«ã€ããŠåŠç¿ããŸããã åã¿ã¹ã¯ã®çµæã䜿çšããåã«åŸ æ©ããŸãã æ¬¡ã®æé ã§ã¯ãä»ã®äœæ¥ã®çµã¿åããã衚ãã¡ãœãããäœæããŸãã æé£ãåºãåã«ããŸããã³ãããŒã¹ããããã®åŸã«ãã¿ãŒãšãžã£ã ãå¡ãæºåãããªããã°ãªããŸããã
ãã®äœæ¥ã¯ã次ã®ã³ãŒãã§è¡šãããšãã§ããŸãã
Async Function MakeToastWithButterAndJamAsync(number As Integer) As Task(Of Toast)
Dim toast As Toast = Await ToastBreadAsync(number)
ApplyButter(toast)
ApplyJam(toast)
Return toast
End Function
MakeToastWithButterAndJamAsync ã¡ãœããã®ã·ã°ããã£ã«ã¯ãã¡ãœããã«AsyncåŒãå«ãŸããŠãããéåææäœãå«ãŸããŠããããšãã³ã³ãã€ã©ã«éç¥ããAwait修食åããããŸãã ãã®ã¡ãœããã¯ããã³ãããŒã¹ããããã¿ãŒãšãžã£ã ãåºããã¿ã¹ã¯ã衚ããŸãã ãã®ã¡ãœããã¯ã3 ã€ã®æäœã®æ§æã衚ã Task<TResult> ãªããžã§ã¯ããè¿ããŸãã
倿Žãããã³ãŒãã®ã¡ã€ã³ ãããã¯ã¯æ¬¡ã®ããã«ãªããŸãã
Async Function Main() As Task
Dim cup As Coffee = PourCoffee()
Console.WriteLine("coffee is ready")
Dim eggsTask = FryEggsAsync(2)
Dim hashBrownTask = FryHashBrownsAsync(3)
Dim toastTask = MakeToastWithButterAndJamAsync(2)
Dim eggs = Await eggsTask
Console.WriteLine("eggs are ready")
Dim hashBrown = Await hashBrownTask
Console.WriteLine("hash browns are ready")
Dim toast = Await toastTask
Console.WriteLine("toast is ready")
Dim oj As Juice = PourOJ()
Console.WriteLine("oj is ready")
Console.WriteLine("Breakfast is ready!")
End Function
ãã®ã³ãŒã倿Žã¯ãéåæã³ãŒããæäœããããã®éèŠãªææ³ã瀺ããŠããŸãã ã¿ã¹ã¯ãäœæããã«ã¯ãã¿ã¹ã¯ãè¿ãæ°ããã¡ãœããã«æäœãåé¢ããŸãã ãã®ã¿ã¹ã¯ãåŸ æ©ããã¿ã€ãã³ã°ãéžæã§ããŸãã ä»ã®ã¿ã¹ã¯ãåæã«éå§ã§ããŸãã
éåæäŸå€ã®åŠç
ãã®æç¹ãŸã§ãã³ãŒãã§ã¯ããã¹ãŠã®ã¿ã¹ã¯ãæ£åžžã«å®äºãããšæé»çã«æ³å®ãããŸãã éåæã¡ãœããã§ãã察å¿ããåæã¡ãœãããšåæ§ã«ãäŸå€ãã¹ããŒãããŸãã äŸå€ãšãšã©ãŒåŠçã®éåæãµããŒãã®ç®æšã¯ãäžè¬çã«éåæãµããŒãã®å Žåãšåãã§ãã ãã¹ã ãã©ã¯ãã£ã¹ã¯ãäžé£ã®åæã¹ããŒãã¡ã³ãã®ããã«èªã¿åãã³ãŒããèšè¿°ããããšã§ãã æ£åžžã«å®äºã§ããªãå Žåãã¿ã¹ã¯ã«ãã£ãŠäŸå€ãã¹ããŒãããŸãã
AwaitåŒãéå§ã¿ã¹ã¯ã«é©çšããããšãã¯ã©ã€ã¢ã³ã ã³ãŒãã¯ãããã®äŸå€ããã£ããã§ããŸãã
æé£ã®äŸã§ã¯ããã³ãããŒã¹ãããŠããéã«ããŒã¹ã¿ãŒãç«ããã£ãããããšããŸãã
ToastBreadAsync ã¡ãœãããæ¬¡ã®ã³ãŒãã«äžèŽããããã«å€æŽããããšã§ããã®åé¡ãã·ãã¥ã¬ãŒãã§ããŸãã
Private Async Function ToastBreadAsync(slices As Integer) As Task(Of Toast)
For slice As Integer = 0 To slices - 1
Console.WriteLine("Putting a slice of bread in the toaster")
Next
Console.WriteLine("Start toasting...")
Await Task.Delay(2000)
Console.WriteLine("Fire! Toast is ruined!")
Throw New InvalidOperationException("The toaster is on fire")
Await Task.Delay(1000)
Console.WriteLine("Remove toast from toaster")
Return New Toast()
End Function
泚
ãã®ã³ãŒããã³ã³ãã€ã«ãããšãå°éã§ããªãã³ãŒãã«é¢ããèŠåã衚瀺ãããŸãã ããã¯ä»æ§ã«åºã¥ããšã©ãŒã§ãã ããŒã¹ã¿ãŒãç«ããã£ããããåŸãæäœã¯æ£åžžã«ç¶è¡ãããã³ãŒãã¯ãšã©ãŒãè¿ããŸãã
ã³ãŒãã倿ŽããåŸãã¢ããªã±ãŒã·ã§ã³ãå®è¡ããåºåã確èªããŸãã
Pouring coffee
Coffee is ready
Warming the egg pan...
putting 3 hash brown patties in the pan
Cooking first side of hash browns...
Putting a slice of bread in the toaster
Putting a slice of bread in the toaster
Start toasting...
Fire! Toast is ruined!
Flipping a hash brown patty
Flipping a hash brown patty
Flipping a hash brown patty
Cooking the second side of hash browns...
Cracking 2 eggs
Cooking the eggs ...
Put hash browns on plate
Put eggs on plate
Eggs are ready
Hash browns are ready
Unhandled exception. System.InvalidOperationException: The toaster is on fire
at AsyncBreakfast.Program.ToastBreadAsync(Int32 slices) in Program.vb:line 65
at AsyncBreakfast.Program.MakeToastWithButterAndJamAsync(Int32 number) in Program.vb:line 36
at AsyncBreakfast.Program.Main(String[] args) in Program.vb:line 24
at AsyncBreakfast.Program.<Main>(String[] args)
ããŒã¹ã¿ãŒãç«ããã£ããããã·ã¹ãã ãäŸå€ã芳å¯ãããŸã§ã®éã«ãããªãã®æ°ã®ã¿ã¹ã¯ãçµäºããŠããããšã«æ³šæããŠãã ããã éåæçã«å®è¡ãããã¿ã¹ã¯ãäŸå€ãã¹ããŒãããšããã®ã¿ã¹ã¯ã« ãšã©ãŒãçºçããŸãã
Task ãªããžã§ã¯ãã¯ãTask.Exception ããããã£ã§ã¹ããŒãããäŸå€ãä¿æããŸãã ãšã©ãŒãçºçããã¿ã¹ã¯ã¯ãåŒãã¿ã¹ã¯ã«é©çšããããšäŸå€ãAwaitããŸãã
ãã®ããã»ã¹ã¯ã次㮠2 ã€ã®éèŠãªã¡ã«ããºã ã§èª¬æãããŠããŸãã
- ãšã©ãŒãçºçããã¿ã¹ã¯ã«äŸå€ãæ ŒçŽããæ¹æ³ã
- ãšã©ãŒçºçã¿ã¹ã¯ã§ã³ãŒããåŸ
æ© (
Await) ãããšããäŸå€ãã¢ã³ããã¯ãããŠåã¹ããŒãããæ¹æ³ã
éåæçã«å®è¡ãããŠããã³ãŒããäŸå€ãã¹ããŒãããšãäŸå€ã¯ Task ãªããžã§ã¯ãã«æ ŒçŽãããŸãã
Task.Exception ããããã£ã¯ãéåæäœæ¥äžã«è€æ°ã®äŸå€ãã¹ããŒãããå¯èœæ§ããããããAggregateException ãªããžã§ã¯ãã§ãã ã¹ããŒãããäŸå€ã¯ãAggregateException.InnerExceptions ã³ã¬ã¯ã·ã§ã³ã«è¿œå ãããŸãã
Exception ããããã£ã null ã®å Žåãæ°ããAggregateException ãªããžã§ã¯ããäœæãããã¹ããŒãããäŸå€ãã³ã¬ã¯ã·ã§ã³å
ã®æåã®é
ç®ã«ãªããŸãã
ãšã©ãŒãçºçããã¿ã¹ã¯ã®æãäžè¬çãªã·ããªãªã¯ã Exception ããããã£ã« 1 ã€ã®äŸå€ãå«ãŸããŠããããšã§ãã ã³ãŒãã¯ãšã©ãŒã«ãªã£ãã¿ã¹ã¯ãåŸ
æ©ããŠãããšããã³ã¬ã¯ã·ã§ã³å
ã®æåã® AggregateException.InnerExceptions äŸå€ãåã¹ããŒããŸãã ãã®çµæã¯ããã®äŸããã®åºåã§ãInvalidOperationException ãªããžã§ã¯ãã§ã¯ãªãAggregateException ãªããžã§ã¯ãã衚瀺ãããçç±ã§ãã æåã®å
éšäŸå€ãæœåºãããšãéåæã¡ãœããã®æäœãã察å¿ããåæã¡ãœããã®æäœã«ã§ããã ã䌌ãŠããããã«ãªããŸãã ã·ããªãªã§è€æ°ã®äŸå€ãçæãããå¯èœæ§ãããå Žåã¯ãã³ãŒãã® Exception ããããã£ã調ã¹ãããšãã§ããŸãã
ãã³ã
æšå¥šãããæ¹æ³ã¯ãåŒæ°ã®æ€èšŒäŸå€ãã¿ã¹ã¯ãè¿ãã¡ãœãããã åæçã« åºçŸããããšã§ãã 詳现ãšäŸã«ã€ããŠã¯ãã ã¿ã¹ã¯ãè¿ãã¡ãœããã®äŸå€ããåç §ããŠãã ããã
次ã®ã»ã¯ã·ã§ã³ã«é²ãåã«ã ToastBreadAsync ã¡ãœããã§æ¬¡ã® 2 ã€ã®ã¹ããŒãã¡ã³ããã³ã¡ã³ãã¢ãŠãããŸãã ãŸãç«äºãèµ·ãããããªãã
' Console.WriteLine("Fire! Toast is ruined!")
' Throw New InvalidOperationException("The toaster is on fire")
await åŒãã¿ã¹ã¯ã«å¹ççã«é©çšãã
Await ã¯ã©ã¹ã®ã¡ãœããã䜿çšããŠãåã®ã³ãŒãã®æåŸã«ããäžé£ã®TaskåŒãæ¹åã§ããŸãã 1 ã€ã® API 㯠WhenAll ã¡ãœããã§ãããåŒæ°ãªã¹ãå
ã®ãã¹ãŠã®ã¿ã¹ã¯ãå®äºãããšãã«å®äºãã Task ãªããžã§ã¯ããè¿ããŸãã æ¬¡ã®ã³ãŒãã¯ããã®ã¡ãœããã瀺ããŠããŸãã
Await Task.WhenAll(eggsTask, hashBrownTask, toastTask)
Console.WriteLine("Eggs are ready")
Console.WriteLine("Hash browns are ready")
Console.WriteLine("Toast is ready")
Console.WriteLine("Breakfast is ready!")
ãã 1 ã€ã®ãªãã·ã§ã³ã¯ã WhenAny ã¡ãœããã䜿çšããããšã§ãããã®ã¡ãœããã¯ãåŒæ°ã®ãããããå®äºãããšãã«å®äºãã Task(Of Task) ãªããžã§ã¯ããè¿ããŸãã ã¿ã¹ã¯ãå®äºããããšãããã£ãŠããã®ã§ãè¿ãããã¿ã¹ã¯ãåŸ
ã€ããšãã§ããŸãã æ¬¡ã®ã³ãŒãã¯ã WhenAny ã¡ãœããã䜿çšããŠãæåã®ã¿ã¹ã¯ãå®äºããã®ãåŸ
æ©ãããã®çµæãåŠçããæ¹æ³ã瀺ããŠããŸãã å®äºããã¿ã¹ã¯ã®çµæãåŠçããåŸã WhenAny ã¡ãœããã«æž¡ãããã¿ã¹ã¯ã®äžèЧããå®äºããã¿ã¹ã¯ãåé€ããŸãã
Module ConcurrentBreakfastProgram
Async Function Main() As Task
Dim cup As Coffee = PourCoffee()
Console.WriteLine("Coffee is ready")
Dim eggsTask As Task(Of Egg) = FryEggsAsync(2)
Dim hashBrownTask As Task(Of HashBrown) = FryHashBrownsAsync(3)
Dim toastTask As Task(Of Toast) = MakeToastWithButterAndJamAsync(2)
Dim breakfastTasks As New List(Of Task) From {eggsTask, hashBrownTask, toastTask}
While breakfastTasks.Count > 0
Dim finishedTask As Task = Await Task.WhenAny(breakfastTasks)
If finishedTask Is eggsTask Then
Console.WriteLine("eggs are ready")
ElseIf finishedTask Is hashBrownTask Then
Console.WriteLine("hash browns are ready")
ElseIf finishedTask Is toastTask Then
Console.WriteLine("toast is ready")
End If
Await finishedTask
breakfastTasks.Remove(finishedTask)
End While
Dim oj As Juice = PourOJ()
Console.WriteLine("oj is ready")
Console.WriteLine("Breakfast is ready!")
End Function
Async Function MakeToastWithButterAndJamAsync(number As Integer) As Task(Of Toast)
Dim toast As Toast = Await ToastBreadAsync(number)
ApplyButter(toast)
ApplyJam(toast)
Return toast
End Function
Private Async Function ToastBreadAsync(slices As Integer) As Task(Of Toast)
For slice As Integer = 0 To slices - 1
Console.WriteLine("Putting a slice of bread in the toaster")
Next
Console.WriteLine("Start toasting...")
Await Task.Delay(3000)
Console.WriteLine("Remove toast from toaster")
Return New Toast()
End Function
Private Async Function FryHashBrownsAsync(patties As Integer) As Task(Of HashBrown)
Console.WriteLine($"putting {patties} hash brown patties in the pan")
Console.WriteLine("cooking first side of hash browns...")
Await Task.Delay(3000)
For patty As Integer = 0 To patties - 1
Console.WriteLine("flipping a hash brown patty")
Next
Console.WriteLine("cooking the second side of hash browns...")
Await Task.Delay(3000)
Console.WriteLine("Put hash browns on plate")
Return New HashBrown()
End Function
Private Async Function FryEggsAsync(howMany As Integer) As Task(Of Egg)
Console.WriteLine("Warming the egg pan...")
Await Task.Delay(3000)
Console.WriteLine($"cracking {howMany} eggs")
Console.WriteLine("cooking the eggs ...")
Await Task.Delay(3000)
Console.WriteLine("Put eggs on plate")
Return New Egg()
End Function
Private Function PourCoffee() As Coffee
Console.WriteLine("Pouring coffee")
Return New Coffee()
End Function
Private Function PourOJ() As Juice
Console.WriteLine("Pouring orange juice")
Return New Juice()
End Function
Private Sub ApplyJam(toast As Toast)
Console.WriteLine("Putting jam on the toast")
End Sub
Private Sub ApplyButter(toast As Toast)
Console.WriteLine("Putting butter on the toast")
End Sub
End Module
ã³ãŒã ã¹ããããã®æ«å°Ÿè¿ãã§ã Await finishedTask åŒã«æ³šç®ããŠãã ããã ãã®è¡ã¯ã Task.WhenAny ã Task(Of Task) (å®äºããã¿ã¹ã¯ãå«ãã©ãã㌠ã¿ã¹ã¯) ãè¿ãã®ã§éèŠã§ãã
Await Task.WhenAnyã®éã«ã¯ã©ãã㌠ã¿ã¹ã¯ãå®äºããã®ãåŸ
ã¡ãæåã«å®äºããã¿ã¹ã¯ãå®éã®çµæãšãªããŸãã ãã ãããã®ã¿ã¹ã¯ã®çµæãååŸããããäŸå€ãé©åã«ã¹ããŒãããããã«ããã«ã¯ãå®äºããã¿ã¹ã¯èªäœ (Awaitã«æ ŒçŽ) ãfinishedTaskããå¿
èŠããããŸãã ã¿ã¹ã¯ãå®äºããããšãç¥ã£ãŠããŠããã¿ã¹ã¯ãå床åŸ
æ©ãããšããã®çµæã«ã¢ã¯ã»ã¹ãããããšã©ãŒã®åå ãšãªã£ãå¯èœæ§ã®ããäŸå€ãåŠçãããã§ããŸãã
æçµçãªã³ãŒãã確èªãã
ã³ãŒãã®æçµããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
Module ConcurrentBreakfastProgram
Async Function Main() As Task
Dim cup As Coffee = PourCoffee()
Console.WriteLine("Coffee is ready")
Dim eggsTask As Task(Of Egg) = FryEggsAsync(2)
Dim hashBrownTask As Task(Of HashBrown) = FryHashBrownsAsync(3)
Dim toastTask As Task(Of Toast) = MakeToastWithButterAndJamAsync(2)
Dim breakfastTasks As New List(Of Task) From {eggsTask, hashBrownTask, toastTask}
While breakfastTasks.Count > 0
Dim finishedTask As Task = Await Task.WhenAny(breakfastTasks)
If finishedTask Is eggsTask Then
Console.WriteLine("eggs are ready")
ElseIf finishedTask Is hashBrownTask Then
Console.WriteLine("hash browns are ready")
ElseIf finishedTask Is toastTask Then
Console.WriteLine("toast is ready")
End If
Await finishedTask
breakfastTasks.Remove(finishedTask)
End While
Dim oj As Juice = PourOJ()
Console.WriteLine("oj is ready")
Console.WriteLine("Breakfast is ready!")
End Function
Async Function MakeToastWithButterAndJamAsync(number As Integer) As Task(Of Toast)
Dim toast As Toast = Await ToastBreadAsync(number)
ApplyButter(toast)
ApplyJam(toast)
Return toast
End Function
Private Async Function ToastBreadAsync(slices As Integer) As Task(Of Toast)
For slice As Integer = 0 To slices - 1
Console.WriteLine("Putting a slice of bread in the toaster")
Next
Console.WriteLine("Start toasting...")
Await Task.Delay(3000)
Console.WriteLine("Remove toast from toaster")
Return New Toast()
End Function
Private Async Function FryHashBrownsAsync(patties As Integer) As Task(Of HashBrown)
Console.WriteLine($"putting {patties} hash brown patties in the pan")
Console.WriteLine("cooking first side of hash browns...")
Await Task.Delay(3000)
For patty As Integer = 0 To patties - 1
Console.WriteLine("flipping a hash brown patty")
Next
Console.WriteLine("cooking the second side of hash browns...")
Await Task.Delay(3000)
Console.WriteLine("Put hash browns on plate")
Return New HashBrown()
End Function
Private Async Function FryEggsAsync(howMany As Integer) As Task(Of Egg)
Console.WriteLine("Warming the egg pan...")
Await Task.Delay(3000)
Console.WriteLine($"cracking {howMany} eggs")
Console.WriteLine("cooking the eggs ...")
Await Task.Delay(3000)
Console.WriteLine("Put eggs on plate")
Return New Egg()
End Function
Private Function PourCoffee() As Coffee
Console.WriteLine("Pouring coffee")
Return New Coffee()
End Function
Private Function PourOJ() As Juice
Console.WriteLine("Pouring orange juice")
Return New Juice()
End Function
Private Sub ApplyJam(toast As Toast)
Console.WriteLine("Putting jam on the toast")
End Sub
Private Sub ApplyButter(toast As Toast)
Console.WriteLine("Putting butter on the toast")
End Sub
End Module
ãã®ã³ãŒãã¯ãéåæã®æé£ã¿ã¹ã¯ãçŽ 15 åã§å®äºããŸãã äžéšã®ã¿ã¹ã¯ã¯åæã«å®è¡ããããããåèšæéãççž®ãããŸãã ã³ãŒãã¯è€æ°ã®ã¿ã¹ã¯ãåæã«ç£èŠããå¿ èŠã«å¿ããŠã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
æåŸã®ã³ãŒãã¯éåæã§ãã ããã¯ã人ãæé£ãäœãæ¹æ³ãããæ£ç¢ºã«åæ ããŠããŸãã æåŸã®ã³ãŒããšèšäºã®æåã®ã³ãŒã ãµã³ãã«ãæ¯èŒããŸãã ã³ã¢ ã¢ã¯ã·ã§ã³ã¯ãã³ãŒããèªã¿åãããšã§åŒãç¶ãæç¢ºã§ãã æåŸã®ã³ãŒãã¯ãèšäºã®åé ã«ç€ºãããã«ãæé£ãäœãããã®æé ã®äžèЧãèªãã®ãšåãæ¹æ³ã§èªãããšãã§ããŸãã
AsyncããŒã¯ãŒããšAwaitããŒã¯ãŒãã®èšèªæ©èœã¯ããã¹ãŠã®äººãæžãããæç€ºã«åŸãããã«è¡ã翻蚳ãæäŸããŸã:ã¿ã¹ã¯ãå®äºããã®ãåŸ
ã£ãŠããéã¯ãã§ããéãã¿ã¹ã¯ãéå§ãããããã¯ããªãã§ãã ããã
Async/await ãš ContinueWith
AsyncããŒã¯ãŒããšAwait ããŒã¯ãŒãã䜿çšãããšãContinueWithãçŽæ¥äœ¿çšããæ§æãç°¡ç¥åãããŸãã
Async
/
AwaitãšContinueWithã«ã¯éåææäœãåŠçããããã®ã»ãã³ãã£ã¯ã¹ã䌌ãŠããŸãããã³ã³ãã€ã©ã¯å¿
ãããAwaitåŒãContinueWithã¡ãœããåŒã³åºãã«çŽæ¥å€æãããšã¯éããŸããã 代ããã«ãã³ã³ãã€ã©ã¯ãåãè«çåäœãæäŸããæé©åãããã¹ããŒã ãã·ã³ ã³ãŒããçæããŸãã ãã®å€æã¯ãç¹ã«è€æ°ã®éåææäœãé£çµããå Žåã«ãèªã¿ããããšä¿å®å®¹ææ§ã«å€§ããªå©ç¹ããããããŸãã
è€æ°ã®é 次éåææäœãå®è¡ããå¿
èŠãããã·ããªãªãèããŠã¿ãŸãããã
ContinueWith
Async
/ãšæ¯èŒããŠãAwaitã䜿çšããŠå®è£
ããå Žåã®åãããžãã¯ã®å€èŠ³ãæ¬¡ã«ç€ºããŸãã
ContinueWith ã®äœ¿çš
ContinueWithã§ã¯ãäžé£ã®éåææäœã®åã¹ãããã«ãã¹ããããåŠçã®ç¶ç¶ãå¿
èŠã§ãã
' Using ContinueWith - demonstrates the complexity when chaining operations
Function MakeBreakfastWithContinueWith() As Task
Return StartCookingEggsAsync() _
.ContinueWith(Function(eggsTask)
Dim eggs = eggsTask.Result
Console.WriteLine("Eggs ready, starting bacon...")
Return StartCookingBaconAsync()
End Function) _
.Unwrap() _
.ContinueWith(Function(baconTask)
Dim bacon = baconTask.Result
Console.WriteLine("Bacon ready, starting toast...")
Return StartToastingBreadAsync()
End Function) _
.Unwrap() _
.ContinueWith(Function(toastTask)
Dim toast = toastTask.Result
Console.WriteLine("Toast ready, applying butter...")
Return ApplyButterAsync(toast)
End Function) _
.Unwrap() _
.ContinueWith(Function(butteredToastTask)
Dim butteredToast = butteredToastTask.Result
Console.WriteLine("Butter applied, applying jam...")
Return ApplyJamAsync(butteredToast)
End Function) _
.Unwrap() _
.ContinueWith(Sub(finalToastTask)
Dim finalToast = finalToastTask.Result
Console.WriteLine("Breakfast completed with ContinueWith!")
End Sub)
End Function
Async/Await ã®äœ¿çš
Async
/
Awaitã䜿çšããåãæäœã®ã·ãŒã±ã³ã¹ã¯ããã£ãšèªç¶ã«èªã¿åããŸãã
' Using Async/Await - much cleaner and easier to read
Async Function MakeBreakfastWithAsyncAwait() As Task
Dim eggs = Await StartCookingEggsAsync()
Console.WriteLine("Eggs ready, starting bacon...")
Dim bacon = Await StartCookingBaconAsync()
Console.WriteLine("Bacon ready, starting toast...")
Dim toast = Await StartToastingBreadAsync()
Console.WriteLine("Toast ready, applying butter...")
Dim butteredToast = Await ApplyButterAsync(toast)
Console.WriteLine("Butter applied, applying jam...")
Dim finalToast = Await ApplyJamAsync(butteredToast)
Console.WriteLine("Breakfast completed with Async/Await!")
End Function
Async/Await ãåªå ãããçç±
Async
/
Awaitã¢ãããŒãã«ã¯ãããã€ãã®å©ç¹ããããŸãã
- èªã¿ããã: ã³ãŒãã¯åæã³ãŒãã®ããã«èªã¿åããæäœã®ãããŒãçè§£ãããããªããŸãã
- ä¿å®å®¹ææ§: ã·ãŒã±ã³ã¹å ã®ã¹ãããã远å ãŸãã¯åé€ããã«ã¯ãæå°éã®ã³ãŒã倿Žãå¿ èŠã§ãã
-
ãšã©ãŒåŠç:
Try/Catchãããã¯ã䜿çšããäŸå€åŠçã¯èªç¶ã«æ©èœããŸãããContinueWithã§ã¯ãé害ãçºçããã¿ã¹ã¯ãæ éã«åŠçããå¿ èŠããããŸãã -
ãããã°:
Async/Awaitã§ã¯ãåŒã³åºãå±¥æŽãšãããã¬ãŒã®ãšã¯ã¹ããªãšã³ã¹ãå€§å¹ ã«åäžããŸãã -
ããã©ãŒãã³ã¹:
Async/Awaitã®ã³ã³ãã€ã©æé©åã¯ãæåã®ContinueWithãã§ãŒã³ãããé«åºŠã§ãã
ãã§ãŒã³æäœã®æ°ãå¢ãããšãã¡ãªãããããã«æããã«ãªããŸãã
ContinueWithã䜿çšã㊠1 ã€ã®ç¶ç¶ã管çã§ããŸããã3 ã€ãŸã㯠4 ã€ä»¥äžã®éåææäœã®ã·ãŒã±ã³ã¹ã¯ããã«èªã¿åããšä¿å®ãå°é£ã«ãªããŸãã ãã®ãã¿ãŒã³ã¯ã颿°åããã°ã©ãã³ã°ã§ã¯ "ã¢ããã£ãã¯ã衚èš" ãšåŒã°ããè€æ°ã®éåææäœãé çªã«èªã¿åãå¯èœãªæ¹æ³ã§äœæã§ããŸãã