主题
Task
任务调度服务,提供任务的立即执行、延迟执行、等待与取消等能力。通过 editor:GetService 获取。
Overview
Task 服务承担协程任务调度职责,可让业务逻辑以立即执行、延后执行或延时执行的方式编排,并为每个被调度的任务返回协程句柄以供取消。Wait 提供协程内的挂起等待能力,从而支持在任务内部控制节奏、等一段时间后再继续。
Get by:
lua
-- @runtime client
local service = editor:GetService("Task")Public API
Spawn
创建一个新任务,并立即开始执行指定的函数。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
func | Function | 要执行的任务函数 |
返回值
| 类型 | 说明 |
|---|---|
thread | 新任务句柄,可传给 Cancel 取消任务 |
立即启动协程任务
lua
-- @runtime client
local Task = editor:GetService('Task')
local coro = Task:Spawn(function()
print('任务执行中')
end)
-- 标准库 coroutine 用点语法查询状态
print('协程状态:', coroutine.status(coro))Defer
创建一个新任务,并在当前帧结束后的下一帧执行指定函数。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
func | Function | 要执行的任务函数 |
返回值
| 类型 | 说明 |
|---|---|
thread | 新任务句柄,可传给 Cancel 取消任务 |
延迟到当前帧末执行
lua
-- @runtime client
local Task = editor:GetService('Task')
local coro = Task:Defer(function()
print('延迟任务执行')
end)
print('协程状态:', coroutine.status(coro))Cancel
取消一个已创建但尚未开始执行的任务。任务正在执行或已执行完毕时无法取消,此时返回 false。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
coro | thread | 待取消的任务句柄 |
返回值
| 类型 | 说明 |
|---|---|
Bool | 是否成功取消;任务已执行完或正在执行中返回 false |
取消 Spawn 创建的协程
lua
-- @runtime client
local Task = editor:GetService('Task')
local coro = Task:Spawn(function()
Task:Wait(10.0) -- 长时间等待,便于取消
end)
local cancelled = Task:Cancel(coro)
print('取消结果:', cancelled)
print('协程状态:', coroutine.status(coro))Delay
创建一个新任务,在指定的等待时长之后执行指定的函数。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
duration | Float | 延迟时间(秒) |
func | Function | 要执行的任务函数 |
返回值
| 类型 | 说明 |
|---|---|
thread | 新任务句柄,可传给 Cancel 取消任务 |
延迟执行并在需要时取消
lua
-- @runtime client
local Task = editor:GetService('Task')
-- Delay 返回 Thread,可像 Spawn/Defer 的结果一样传给 Cancel
local delayThread = Task:Delay(2.0, function()
print('2 秒后执行')
end)
local cancelled = Task:Cancel(delayThread)
print('取消结果:', cancelled)Wait
挂起当前任务,等待指定的时长后继续执行,并返回实际等待的秒数。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
duration | Float | 等待时长(秒) |
返回值
| 类型 | 说明 |
|---|---|
Float | 实际等待的时长(秒) |
在协程内暂停当前协程
lua
-- @runtime client
local Task = editor:GetService('Task')
Task:Spawn(function()
print('开始等待')
Task:Wait(1.0) -- 只能在协程内调用
print('1 秒后继续')
end)