任务系统(Tasks System)位于 UE::Tasks 命名空间中。要使用任务系统,你需要添加 Tasks/Task.h 头文件。你可以参考 Tests/Tasks/TasksTest.cpp 类,了解用法。
下表介绍了任务系统的一些关键函数。
| 引用 | 说明 |
|---|---|
TTask<ResultType>() |
某个任务的句柄。它使用引用计数器来管理任务的生命周期。
|
TTask<ResultType>::IsValid() |
函数:
在任务句柄引用一个任务时返回true。默认构造的任务句柄为"空",因此"无效"。任务在启动时构造。例如:
|
Task<ResultType>::Launch |
启动任务进行异步执行。在下面的代码示例中,Launch用于一个任务,并返回其句柄:
先决条件是,必须先完成该任务所依赖的其他任务,然后再执行该任务。所有先决条件都完成后,该任务会自动安排执行。
参数:
示例:
|
TTask<ResultType>::IsCompleted |
如果任务已完成或无效,则返回true。
如果 某个任务完成执行并且其所有嵌套任务都完成,则该任务完成。 示例:
如需更多示例,你可以观察以下任务: |
TTask<ResultType>::Wait |
阻塞当前线程,直至任务完成或等待发生超时。超时后返回false。等待时间可能超过指定的超时值。如果
示例:
如果任务执行尚未启动(它被先决条件阻塞,或者尚未由工作线程拾取),等待时将"收回"该任务并在本地(内联)执行。由于任务执行尚未启动,当工作线程执行该任务时,需要阻塞等待线程。由等待线程执行任务并不是缓慢的过程,而可以更快,并且不占用工作线程。 任务收回将遵循任务依赖性,即所谓的"深度任务收回"。如果任务执行被先决条件阻塞,任务收回将尝试以递归方式收回并执行其先决条件,从而取消阻塞该任务。 如果任务收回因任何原因而失败(任务执行已经启动),将回退为阻塞等待。 示例:
上面的示例启动了三个任务,其中 |
TTask<ResultType>::BusyWait (已废弃) |
在UE5.5中,忙等待已被废弃。 详情及替代方案建议,请参阅任务系统一文中的BusyWait一节。 忙等待某个任务是指在等待该任务完成的同时执行其他无关任务。这可以提高系统吞吐量,但应谨慎使用。忙等待可能花费比阻塞等待更长的时间,并可能影响延迟敏感的任务链。 在下面的函数中,该任务将执行其他已准备好执行的任务,直至所等待的任务完成。接下来,该任务在BusyWait返回后完成。
在下面的代码示例中,我们执行其他已准备好执行的任务,直至所等待的任务完成或等待发生超时。接下来,我们在超时后返回false。等待时间可能超过指定的超时值。如果BusyWait返回true,则任务完成。
在执行无关任务之前,忙等待首先会尝试收回所等待的任务。
|
TTask<ResultType>::GetResult |
返回该任务因其执行所返回的对象的引用(任务主体执行返回的值)。
如果任务完成,调用会立即返回。否则,它会阻塞,直至任务完成。 销毁任务对象时,即释放对任务对象的最后一个引用时,也会销毁结果对象。 如果任务无效,调用会进行断言。 示例:
|
AddNested() |
将给定任务注册为"当前"任务(父任务)的"嵌套"任务。当前任务 是当前线程所执行的任务。 父任务 在所有嵌套任务都完成之后才完成。 断言是否没有从另一个任务内部调用。
示例:
|
FTaskEvent
FTaskEvent会将其API的一部分与 TTask<ResultType> 共享。例如,IsValid() 、 IsCompleted() 等待和忙等待API是相同的。本小节仅介绍了特定于FTaskEvent的API。
| 引用任务事件 | 说明 |
|---|---|
FTaskEvent构造函数 |
|
FTaskEvent::AddPrerequisites |
将其他任务(或任务事件)添加为先决条件。只能在触发任务事件之前调用。仅当所有先决条件都完成并且任务事件已触发时,它才为"已完成"("信令")。
示例:
|
FTaskEvent::Trigger |
任务事件在触发之前是未完成("非信令")。触发任务事件并不一定会使其成为信令,仅当其所有先决条件都完成并且任务事件已触发时,它才为已完成。 每个任务事件都必须触发。否则,其析构函数将断言任务事件未完成。
|
FPipe
管道是不可复制、不可移动的轻量级对象。管道的构造不会分配动态内存,并且不会执行昂贵的处理。
| 引用名称 | 说明 |
|---|---|
FPipe构造函数 |
使用给定调试名称构造管道对象。调试名称用于调试之用,以识别管道对象。
管道是不可复制、不可移动的轻量级对象。管道的构造不会分配动态内存,并且不会执行昂贵的处理 |
FPipe析构函数 |
检查管道是否有未完成的任务。管道在销毁时不能有未完成的任务。 |
HasWork() |
检查管道是否有未完成的任务。管道在销毁时不能有未完成的任务。
|
WaitUntilEmpty() |
该调用将阻塞,直至管道的所有任务都完成。
请参考函数 |
Launch() |
在管道中启动一个任务。相同管道中启动的任务不会并发执行(一个接一个),但可以由不同的工作线程执行。
|
IsInContext() |
如果从属于该管道的任务内部调用,则返回true。可以用于检查访问受管道保护的共享资源是否安全,例如,当代码没有作用域被管道化的任务所执行时。
|