> For the complete documentation index, see [llms.txt](https://docs.overdare.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.overdare.com/korean/manual/script-manual/advanced-gameplay-systems/task.md).

# task로 편리하게 coroutine 제어하기

## 개요

task는 비동기 작업을 위해 스레드의 스케줄링을 다룰 수 있도록 기능을 제공하는 라이브러리 입니다.

## 사용 방법

| 기능                                          | 설명                                                                                                             |
| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| task.wait(delay)                            | delay초 만큼 스레드를 일시정지할 수 있습니다. n초가 지난 후에는 현재 스레드가 다시 재개됩니다. 실행된 뒤에는 실제 일시정지된 시간을 반환합니다.                          |
| task.spawn(functionOrCoroutine, ...)        | functionOrCoroutine에 대한 코루틴을 생성하고 즉시 재개합니다. functionOrCoroutine뒤에 오는 인자들은 모두 functionOrCoroutine의 매개변수로 전달됩니다. |
| task.delay(delay, functionOrCoroutine, ...) | 코루틴을 생성한 후 delay초 뒤에 재개합니다. functionOrCoroutine 뒤에 오는 인자들은 모두 functionOrCoroutine의 매개변수로 전달됩니다.                |
| task.defer(functionOrCoroutine, ...)        | 현재 실행 중인 코루틴이 종료된 즉시 코루틴 함수를 실행되도록 예약합니다. functionOrCoroutine 뒤에 오는 인자들은 모두 functionOrCoroutine의 매개변수로 전달됩니다.  |
| task.cancel(coroutine)                      | 아직 실행되지 않은 coroutine을 취소합니다.                                                                                   |

### 1. 스레드 일시정지하기

다음은 현재 스레드를 1초간 일시정지하는 예제입니다.

```lua
local elapsedTime = task.wait(1)
print(`task.wait(1) real waited time(sec): {elapsedTime}`)
```

### 2. 즉시 코루틴 생성 및 실행하기

다음은 생성된 후 즉시 재개되는 코루틴에 여러 type의 데이터를 전달하고 출력하는 예제입니다.

```lua
local function TaskSpawn(a, b, c, tbl)
    print("task.spawn executed", a, b, c)
    for k, v in pairs(tbl) do
        print(`["{k}"]: {v} ({typeof(v)})`)
    end
end
task.spawn(TaskSpawn, "arg1", 123, true, {x = 78, y = "90"})
```

### 3. 일정 시간 뒤 코루틴 함수 실행하기

다음은 코루틴을 생성하되, 1.5초 뒤에 재개하는 예제입니다. 코루틴에 string 형태의 message를 전달하고, 생성된 coroutine을 출력합니다.

```lua
local function TaskDelay(message)
    print("task.delay executed: ", message)
end
local delayedCoroutine= task.delay(1.5, TaskDelay, "Here is delayed message")
print(`delayedCoroutine: {delayedCoroutine}`)
```

### 4. 실행 중인 코루틴이 종료될 때 새로운 코루틴 함수 실행 예약하기

다음은 생성된 후 이미 실행 중인 코루틴이 종료될 때 재개되는 새로운코루틴에 몇 개의 데이터를 전달하고 출력하는 예제입니다.

```lua
local function TaskDefer(x, y)
    print("task.defer executed: ", x, y)
end
task.defer(TaskDefer, "defer_arg", 456)
```

### 5. 실행 예약된 코루틴 함수 취소하기

다음은 task.spawn(), task.delay(), task.defer()로 마지막에 예약된 코루틴 함수에 대해 실행을 취소합니다. 이미 실행 중인 코루틴은 중지할 수 없습니다.

```lua
local function TaskDelayForCancel()
    print("This should not be print")
end
local cancelCoroutine = task.delay(5, TaskDelayForCancel)
task.cancel(cancelCoroutine)
```
