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 以移除回呼時使用的權杖。
