API Basic Async ko - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

Async / Await / Delay

ClassicUO โ€ข Basic

Async Function์€ ์Šคํฌ๋ฆฝํŠธ ์ž‘์—…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Await๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ค‘๋‹จํ•˜์—ฌ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค๋ฅธ ์ค€๋น„๋œ ์ž‘์—…์ด ์ง„ํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์Šค๋ ˆ๋“œ๋‚˜ ์ „์ฒด VB.NET Task ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ ๊ตฌ๋ฌธ

Async Function Work(ByVal value As Integer) As Task(Of Integer)
    Await Delay(100)
    Return value
End Function
Async Function Work() As Task
    Await Delay(100)
End Function
Delay(milliseconds) -> Object (ScriptTask)
Await task
Dim value = Await task
value = Await task
Return Await task
task.IsCompleted() -> Integer (0/1)
task.IsFaulted() -> Integer (0/1)
task.IsCanceled() -> Integer (0/1)
task.Result() -> T / Unit

๋งค๊ฐœ๋ณ€์ˆ˜

  • milliseconds โ€” Delay๋Š” 0..2147483647 ๋ฐ€๋ฆฌ์ดˆ์˜ Integer๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. 0์€ ์ฆ‰์‹œ ์™„๋ฃŒํ•˜๋ฉฐ ์Œ์ˆ˜, ์†Œ์ˆ˜์™€ String์€ ์žก์„ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ƒ…๋‹ˆ๋‹ค. ๋‹จ์กฐ ์‹œ๊ณ„๋กœ ์ตœ์†Œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ •ํ•˜๋ฉฐ ์ •ํ™•ํ•œ ์‹คํ–‰ ์‹œ๊ฐ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Async Function / ByVal / Task(Of T) โ€” As Task๋Š” ๊ฐ’์ด ์—†๊ณ  As Task(Of T)๋Š” Basic ์Šค์นผ๋ผ ๋˜๋Š” Object/Variant ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ช…์‹œ์  ByVal ๋˜๋Š” ParamArray๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ Optional๊ณผ ๋ช…๋ช…๋œ ์ธ์ˆ˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ByRef, Async Sub/Declare๋Š” ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์€ ํ”„๋กœ์‹œ์ € ๋ณธ๋ฌธ์—์„œ ๋งŒ๋“ค๊ณ  ์ „์—ญ ํ•„๋“œ๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ธฐ๋ณธ๊ฐ’ ์ดˆ๊ธฐํ™”์—์„œ๋Š” ๋งŒ๋“ค์ง€ ๋งˆ์„ธ์š”.
  • task / Await โ€” ์ž‘์—… ๋ณ€์ˆ˜๋Š” ํ˜•์‹์„ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ As Object๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. Await๋Š” ํ˜„์žฌ ์‹คํ–‰์˜ ์ž‘์—…์„ ๋…๋ฆฝ ๋ฌธ์žฅ, ๋‹จ์ผ ์Šค์นผ๋ผ ์„ ์–ธ/๋Œ€์ž…์˜ ์ „์ฒด ์˜ค๋ฅธ์ชฝ, Return Await๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์‚ฐ์ˆ , ์กฐ๊ฑด, ํ•„๋“œ/์ธ๋ฑ์Šค ๋Œ€์ž…, Catch/Finally ๋ฐ Async Function ๋ฐ–์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ๊ฐ™์€ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์ˆœํ™˜ ์˜์กด์„ฑ์€ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
  • IsCompleted / IsFaulted / IsCanceled / Result โ€” IsCompleted๋Š” ์„ฑ๊ณตยท์‹คํŒจยท์ทจ์†Œ ํ›„ 1, IsFaulted๋Š” ์‹คํŒจ ์‹œ 1, IsCanceled๋Š” ์ทจ์†Œ ์‹œ 1์ž…๋‹ˆ๋‹ค. ์ด Integer ์กฐ๊ฑด์€ True/False์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Result()๋Š” ์ €์žฅ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋ฏธ์™„๋ฃŒ๋ฉด ์˜ค๋ฅ˜, ์‹คํŒจํ–ˆ์œผ๋ฉด ์›๋ž˜ ์˜ค๋ฅ˜๋ฅผ ๋‹ค์‹œ ๋˜์ง‘๋‹ˆ๋‹ค. ์ด์ „ ์‹คํ–‰์˜ ์ž‘์—…์€ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์Šคํฌ๋ฆฝํŠธ์—์„œ Async Function๊ณผ Delay๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ฆ‰์‹œ T๊ฐ€ ์•„๋‹Œ Object (ScriptTask)๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. Await์™€ Result()๋Š” T๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ As Task์™€ Delay๋Š” ๊ฐ’ ์—†๋Š” Unit์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ Async Function์„ ์ง„์ž…์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ํ˜‘๋ ฅ์ ์œผ๋กœ ๊ธฐ๋‹ค๋ ค ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ญ์ƒ Boolean์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฏธ์™„๋ฃŒ Await๊นŒ์ง€ ์ฆ‰์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ญ ๋ณ€์ˆ˜, ๋ฐ˜๋ณต ์œ„์น˜, With ๊ฐ์ฒด์™€ ๋””๋ฒ„๊ฑฐ ํ”„๋ ˆ์ž„์„ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ์žฌ๊ฐœํ•  ๋•Œ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์™„๋ฃŒ๋œ ์ž‘์—…์€ ์ค‘๋‹จํ•˜์ง€ ์•Š์œผ๋ฉฐ Await ํ”ผ์—ฐ์‚ฐ์ž๋Š” ํ•œ ๋ฒˆ๋งŒ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํฌ๋ฆฝํŠธ ์†Œ์œ  ์Šค๋ ˆ๋“œ๋Š” ์•ˆ์ „ํ•œ ํ™•์ธ ์ง€์ ์—์„œ ๊ธฐํ•œ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ•œ ํšŒ์— ์ตœ๋Œ€ 64๊ฐœ์˜ ์ค€๋น„๋œ ๊ณ„์† ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์Šค๋ ˆ๋“œ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋™๊ธฐ Wait๋‚˜ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒŒ์ž„/๋„ค์ดํ‹ฐ๋ธŒ ํ˜ธ์ถœ์€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Await Delay๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋ฏธ์™„๋ฃŒ ์ž‘์—… ๋˜๋Š” ์•„์ง ์ฝ์ง€ ์•Š์€ ์‹คํŒจ ์ž‘์—…์€ ์ตœ๋Œ€ 1024๊ฐœ์ž…๋‹ˆ๋‹ค.
  • ์ผ์‹œ ์ •์ง€๋Š” ๊ณ„์† ์‹คํ–‰์„ ๋ง‰์ง€๋งŒ ์‹œ๊ฐ„์€ ํ๋ฆ…๋‹ˆ๋‹ค. ์žฌ๊ฐœํ•˜๋ฉด ๊ธฐํ•œ์ด ์ง€๋‚œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Stop, ์˜ค๋ฅ˜ ๋˜๋Š” ์ง„์ž…์  ๋ฐ˜ํ™˜์€ ๋‚จ์€ ์ž‘์—…์„ ์ทจ์†Œํ•˜๊ณ  Using ์ž์›๊ณผ ๋ฐ˜๋ณต์ž๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ๋น„์ƒ ์ทจ์†Œ๋Š” ์Šคํฌ๋ฆฝํŠธ Catch/Finally๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ์ฝ์ง€ ์•Š์€ ์ž‘์—… ์˜ค๋ฅ˜๋Š” ์ง„์ž…์  ์ข…๋ฃŒ ์‹œ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. IDE๋งŒ ๋‹ซ์•„์„œ๋Š” ์‹คํ–‰ ์ค‘์ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Task.Run/WhenAll, ์™ธ๋ถ€ .NET ์ž‘์—…, Async Sub, Catch/Finally ๋‚ด Await, ์ง€์—ญ As Task ์„ ์–ธ์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ž‘์—…๋ณด๋‹ค Main์ด ๋จผ์ € ๋๋‚˜์ง€ ์•Š๊ฒŒ ํ•˜์„ธ์š”. Async/Await๋Š” ์˜ˆ์•ฝ์–ด์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ

1. ๋…๋ฆฝ์ ์ธ ๋‘ ๋Œ€๊ธฐ

# ValueLater๋Š” value์™€ milliseconds๋ฅผ ๊ฐ’์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ธฐ ์ „์— ๋‘ ํ˜ธ์ถœ์„ ์‹œ์ž‘ํ•˜์—ฌ 10ms ํ›„ 22, 30ms ํ›„ 20์„ ์–ป์Šต๋‹ˆ๋‹ค. Main์€ ์ตœ๋Œ€ 5000ms ๊ธฐ๋‹ค๋ฆฐ ํ›„ Result()์˜ Integer๋ฅผ ๋”ํ•ด 42๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Wait Until ์‹œ๊ฐ„ ์ดˆ๊ณผ๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
Option Explicit On
Async Function ValueLater(ByVal value As Integer, ByVal milliseconds As Integer) As Task(Of Integer)
    Await Delay(milliseconds)
    Return value
End Function

Sub Main()
    Dim first = ValueLater(20, 30)
    Dim second = ValueLater(22, 10)
    Wait Until first.IsCompleted() AndAlso second.IsCompleted() Timeout 5000
    Return first.Result() + second.Result()
End Sub

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์‹คํ–‰ ์„ค๋ช…:

ValueLater๋Š” value์™€ milliseconds๋ฅผ ๊ฐ’์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ธฐ ์ „์— ๋‘ ํ˜ธ์ถœ์„ ์‹œ์ž‘ํ•˜์—ฌ 10ms ํ›„ 22, 30ms ํ›„ 20์„ ์–ป์Šต๋‹ˆ๋‹ค. Main์€ ์ตœ๋Œ€ 5000ms ๊ธฐ๋‹ค๋ฆฐ ํ›„ Result()์˜ Integer๋ฅผ ๋”ํ•ด 42๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Wait Until ์‹œ๊ฐ„ ์ดˆ๊ณผ๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

2. ๋Œ€๊ธฐ ์ค‘ ์˜ค๋ฅ˜ ์žก๊ธฐ

# FailLater๋Š” ๊ฐ’์ด ์—†๊ณ  5ms ํ›„ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค. ReadFailure๊ฐ€ Await์—์„œ ์ด๋ฅผ ๋ฐ›์•„ ํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๊ณ  Finally์—์„œ ๊ณต์œ  ์ •๋ฆฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Main์€ ์ตœ๋Œ€ 5000ms ๊ธฐ๋‹ค๋ ค String "failed:1"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 1์€ True์ด๋ฉฐ Catch/Finally์—๋Š” Await๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
Option Explicit On
Module State
    Public Dim cleaned As Boolean = False
End Module

Async Function FailLater() As Task
    Await Delay(5)
    Throw "failed"
End Function

Async Function ReadFailure() As Task(Of String)
    Dim message As String = ""
    Try
        Await FailLater()
    Catch problem
        message = problem
    Finally
        State.cleaned = True
    End Try
    Return message & ":" & CStr(State.cleaned)
End Function

Sub Main()
    Dim task = ReadFailure()
    Wait Until task.IsCompleted() Timeout 5000
    Return task.Result()
End Sub

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์‹คํ–‰ ์„ค๋ช…:

FailLater๋Š” ๊ฐ’์ด ์—†๊ณ  5ms ํ›„ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค. ReadFailure๊ฐ€ Await์—์„œ ์ด๋ฅผ ๋ฐ›์•„ ํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๊ณ  Finally์—์„œ ๊ณต์œ  ์ •๋ฆฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Main์€ ์ตœ๋Œ€ 5000ms ๊ธฐ๋‹ค๋ ค String "failed:1"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 1์€ True์ด๋ฉฐ Catch/Finally์—๋Š” Await๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

3. ๋ฐ˜๋ณต๊ณผ ๊ฒฐ๊ณผ ์ „๋‹ฌ

# IncrementLater(value)๋Š” 5ms ๊ธฐ๋‹ค๋ ค value+1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. SumLater๋Š” total๊ณผ i๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ i=1..3 ํ˜ธ์ถœ์„ ์ˆœ์„œ๋Œ€๋กœ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ForwardResult๊ฐ€ Return Await๋กœ 9๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Main์˜ Integer 9๋Š” ํ•ฉ๊ณ„์ด๋ฉฐ ๋…ผ๋ฆฌ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค.
Option Explicit On
Async Function IncrementLater(ByVal value As Integer) As Task(Of Integer)
    Await Delay(5)
    Return value + 1
End Function

Async Function SumLater() As Task(Of Integer)
    Dim total As Integer = 0
    For Var i = 1 To 3
        Dim nextValue = Await IncrementLater(i)
        total += nextValue
    Next
    Return total
End Function

Async Function ForwardResult() As Task(Of Integer)
    Return Await SumLater()
End Function

Sub Main()
    Dim task = ForwardResult()
    Wait Until task.IsCompleted() Timeout 5000
    Return task.Result()
End Sub

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์‹คํ–‰ ์„ค๋ช…:

IncrementLater(value)๋Š” 5ms ๊ธฐ๋‹ค๋ ค value+1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. SumLater๋Š” total๊ณผ i๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ i=1..3 ํ˜ธ์ถœ์„ ์ˆœ์„œ๋Œ€๋กœ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ForwardResult๊ฐ€ Return Await๋กœ 9๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Main์˜ Integer 9๋Š” ํ•ฉ๊ณ„์ด๋ฉฐ ๋…ผ๋ฆฌ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ํ•จ์ˆ˜: ํ˜ธ์ถœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๊นŒ์ง€

ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฏธ์™„๋ฃŒ Await๊นŒ์ง€ ์ฆ‰์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ญ ๋ณ€์ˆ˜, ๋ฐ˜๋ณต ์œ„์น˜, With ๊ฐ์ฒด์™€ ๋””๋ฒ„๊ฑฐ ํ”„๋ ˆ์ž„์„ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ์žฌ๊ฐœํ•  ๋•Œ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์™„๋ฃŒ๋œ ์ž‘์—…์€ ์ค‘๋‹จํ•˜์ง€ ์•Š์œผ๋ฉฐ Await ํ”ผ์—ฐ์‚ฐ์ž๋Š” ํ•œ ๋ฒˆ๋งŒ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

1. Delay

Delay๋Š” 0..2147483647 ๋ฐ€๋ฆฌ์ดˆ์˜ Integer๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. 0์€ ์ฆ‰์‹œ ์™„๋ฃŒํ•˜๋ฉฐ ์Œ์ˆ˜, ์†Œ์ˆ˜์™€ String์€ ์žก์„ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ƒ…๋‹ˆ๋‹ค. ๋‹จ์กฐ ์‹œ๊ณ„๋กœ ์ตœ์†Œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ •ํ•˜๋ฉฐ ์ •ํ™•ํ•œ ์‹คํ–‰ ์‹œ๊ฐ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

due = monotonicNow + milliseconds return task

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ScriptAsyncScheduler.cs; ํ•จ์ˆ˜ Delay.

2. ResolveAwaitTask

์ž‘์—… ๋ณ€์ˆ˜๋Š” ํ˜•์‹์„ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ As Object๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. Await๋Š” ํ˜„์žฌ ์‹คํ–‰์˜ ์ž‘์—…์„ ๋…๋ฆฝ ๋ฌธ์žฅ, ๋‹จ์ผ ์Šค์นผ๋ผ ์„ ์–ธ/๋Œ€์ž…์˜ ์ „์ฒด ์˜ค๋ฅธ์ชฝ, Return Await๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์‚ฐ์ˆ , ์กฐ๊ฑด, ํ•„๋“œ/์ธ๋ฑ์Šค ๋Œ€์ž…, Catch/Finally ๋ฐ Async Function ๋ฐ–์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ๊ฐ™์€ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์ˆœํ™˜ ์˜์กด์„ฑ์€ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

validate owner and dependency chain evaluate operand once

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.Async.cs; ํ•จ์ˆ˜ ResolveAwaitTask.

3. ExecuteSubrutine

ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฏธ์™„๋ฃŒ Await๊นŒ์ง€ ์ฆ‰์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ญ ๋ณ€์ˆ˜, ๋ฐ˜๋ณต ์œ„์น˜, With ๊ฐ์ฒด์™€ ๋””๋ฒ„๊ฑฐ ํ”„๋ ˆ์ž„์„ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ์žฌ๊ฐœํ•  ๋•Œ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์™„๋ฃŒ๋œ ์ž‘์—…์€ ์ค‘๋‹จํ•˜์ง€ ์•Š์œผ๋ฉฐ Await ํ”ผ์—ฐ์‚ฐ์ž๋Š” ํ•œ ๋ฒˆ๋งŒ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

save locals, With receiver, debugger frame suspend until task completes restore saved state

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.cs; ํ•จ์ˆ˜ ExecuteSubrutine.

4. Pump

์Šคํฌ๋ฆฝํŠธ ์†Œ์œ  ์Šค๋ ˆ๋“œ๋Š” ์•ˆ์ „ํ•œ ํ™•์ธ ์ง€์ ์—์„œ ๊ธฐํ•œ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ•œ ํšŒ์— ์ตœ๋Œ€ 64๊ฐœ์˜ ์ค€๋น„๋œ ๊ณ„์† ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์Šค๋ ˆ๋“œ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋™๊ธฐ Wait๋‚˜ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒŒ์ž„/๋„ค์ดํ‹ฐ๋ธŒ ํ˜ธ์ถœ์€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Await Delay๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋ฏธ์™„๋ฃŒ ์ž‘์—… ๋˜๋Š” ์•„์ง ์ฝ์ง€ ์•Š์€ ์‹คํŒจ ์ž‘์—…์€ ์ตœ๋Œ€ 1024๊ฐœ์ž…๋‹ˆ๋‹ค.

if earliest deadline reached: complete delays resume at most 64 queued continuations refresh function results

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ScriptAsyncScheduler.cs; ํ•จ์ˆ˜ Pump.

5. GetResult

IsCompleted๋Š” ์„ฑ๊ณตยท์‹คํŒจยท์ทจ์†Œ ํ›„ 1, IsFaulted๋Š” ์‹คํŒจ ์‹œ 1, IsCanceled๋Š” ์ทจ์†Œ ์‹œ 1์ž…๋‹ˆ๋‹ค. ์ด Integer ์กฐ๊ฑด์€ True/False์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Result()๋Š” ์ €์žฅ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋ฏธ์™„๋ฃŒ๋ฉด ์˜ค๋ฅ˜, ์‹คํŒจํ–ˆ์œผ๋ฉด ์›๋ž˜ ์˜ค๋ฅ˜๋ฅผ ๋‹ค์‹œ ๋˜์ง‘๋‹ˆ๋‹ค. ์ด์ „ ์‹คํ–‰์˜ ์ž‘์—…์€ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

if pending: error if failed: rethrow return saved value

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/ScriptTaskObject.cs; ํ•จ์ˆ˜ GetResult.

6. Release

์ผ์‹œ ์ •์ง€๋Š” ๊ณ„์† ์‹คํ–‰์„ ๋ง‰์ง€๋งŒ ์‹œ๊ฐ„์€ ํ๋ฆ…๋‹ˆ๋‹ค. ์žฌ๊ฐœํ•˜๋ฉด ๊ธฐํ•œ์ด ์ง€๋‚œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Stop, ์˜ค๋ฅ˜ ๋˜๋Š” ์ง„์ž…์  ๋ฐ˜ํ™˜์€ ๋‚จ์€ ์ž‘์—…์„ ์ทจ์†Œํ•˜๊ณ  Using ์ž์›๊ณผ ๋ฐ˜๋ณต์ž๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. ๋น„์ƒ ์ทจ์†Œ๋Š” ์Šคํฌ๋ฆฝํŠธ Catch/Finally๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ์ฝ์ง€ ์•Š์€ ์ž‘์—… ์˜ค๋ฅ˜๋Š” ์ง„์ž…์  ์ข…๋ฃŒ ์‹œ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. IDE๋งŒ ๋‹ซ์•„์„œ๋Š” ์‹คํ–‰ ์ค‘์ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

cancel pending tasks drain cleanup continuations release resources report unobserved failure

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ScriptAsyncScheduler.cs; ํ•จ์ˆ˜ Release.

์Šคํฌ๋ฆฝํŠธ์—์„œ Async Function๊ณผ Delay๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ฆ‰์‹œ T๊ฐ€ ์•„๋‹Œ Object (ScriptTask)๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. Await์™€ Result()๋Š” T๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ As Task์™€ Delay๋Š” ๊ฐ’ ์—†๋Š” Unit์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ Async Function์„ ์ง„์ž…์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ํ˜‘๋ ฅ์ ์œผ๋กœ ๊ธฐ๋‹ค๋ ค ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ญ์ƒ Boolean์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.


en ยท ru ยท uk ยท fr ยท de ยท it ยท es ยท zh-tw ยท ja ยท ko

Basic