XAsyncBlock
让我们详细看一下 XAsyncBlock。它是一个定义如下的结构体:- queue - 一个 XTaskQueueHandle,它是一个句柄,代表关于在哪里运行工作的信息。如果未设置此参数,则使用默认队列。
- context - 允许您向回调函数传递数据。
- callback - 一个可选的回调函数,将在异步工作完成后被调用。如果不指定回调,可以使用 XAsyncGetStatus 等待 XAsyncBlock 完成,然后获取结果。
重要事项: XAsyncBlock 在异步任务完成之前必须保留在内存中。如果它是动态分配的,可以在 XAsyncBlock 的完成回调内删除。
等待异步任务
您可以通过两种不同的方式判断异步任务是否已完成:- XAsyncBlock 的完成回调被调用。
- 使用 true 调用 XAsyncGetStatus 以等待其完成。
获取异步任务的结果
要获取结果,大多数异步 API 函数都有一个对应的 Result 函数用于接收异步调用的结果。 在示例代码中,PFProfilesGetProfileAsync 有一个对应的 PFProfilesGetProfileGetResult 函数。您可以使用此函数来检索函数结果并做出相应处理。 有关检索结果的完整详细信息,请参阅每个异步 API 函数的文档。XTaskQueueHandle
XTaskQueueHandle 允许您确定哪个线程执行异步任务,以及哪个线程调用 XAsyncBlock 的完成回调。 您可以通过设置调度模式来控制哪个线程执行这些操作。有三种可用的调度模式:- Manual - 手动队列不会自动调度。由开发者决定在哪个线程上调度它们。这可用于将异步调用的工作端或回调端指定给特定线程。
- Thread Pool - 使用线程池进行调度。线程池会并行调用,随着线程池线程变得可用,依次从队列中取出调用执行。Thread Pool 最易使用,但对使用哪个线程的控制最少。
- Serialized Thread Pool - 使用线程池进行调度。线程池串行调用,随着单个线程池线程变得可用,依次从队列中取出调用执行。
- Immediate - 立即在提交队列工作的线程上调度队列工作。
手动调度 XTaskQueueHandle
如果您对 XTaskQueueHandle 的工作队列或完成队列使用了手动队列调度模式,则需要手动调度。假设创建了一个 XTaskQueueHandle,其中工作队列和完成队列都设置为手动调度,如下所示:- queue - 要调度工作的队列。
- port - XTaskQueuePort 枚举的一个实例。
- timeoutInMs - 一个 uint32_t,以毫秒为单位的超时时间。
何时调用 XTaskQueueDispatch
为了检查队列何时接收到新项目,您可以调用 XTaskQueueRegisterMonitor 设置一个事件处理程序,让您的代码知道有工作或完成项已就绪可供调度。- queue - 您要为其提交回调的异步队列。
- callbackContext - 指向应传递给提交回调的数据的指针。
- callback - 当新回调被提交到队列时调用的函数。
- token - 一个令牌,用于之后调用 XTaskQueueUnregisterMonitor 以移除回调。
