次の方法で共有


キャンセル機能のセットアップの例

このトピックでは、カスタム プロバイダー コールバックのキャンセル機能をセットアップする方法の例を示します。 XAsyncRun を使用して開始された基本的な非同期メソッドをキャンセルすることはできません。 キャンセル機能のサポートは、カスタム プロバイダーを使用しているときに手動で追加できます。 サポートが追加された後、XAsyncCancel によって Cancel ケースをトリガーします。

// Provider callback.
[](XAsyncOp op, const XAsyncProviderData* providerData)
{
    switch(op)
    {
        case XAsyncOp::DoWork:
        {
            bool canceled = false;
            while (true)
            {
                DWORD waitResult = WaitForSingleObject(callData->cancelEvent, 0);
                if (waitResult != WAIT_TIMEOUT)
                {
                    canceled = true;
                    break;
                }

                // Continue doing normal work. Should break if completed.
            }

            if (canceled)
            {
                XAsyncComplete(providerData->async, E_ABORT, 0);
            }
            else
            {
                XAsyncComplete(providerData->async, S_OK, 0);
            }

            break;
        }
        
        case XAsyncOp::Cancel:
            SetEvent(callData->cancelEvent);
            break;

        // Other cases.
    }
}

このようなプロバイダーの場合、キャンセル可能性のサポートは Windows イベントを使用して追加されます。 Cancel ケースが呼び出され、DoWork ケースが E_ABORT の状態で XAsyncComplete の呼び出しによって終了する場合、イベントが設定されます。 キャンセルのシグナルの送信には、任意の方法が使用できます。 ただし、イベントは、ターゲットにできる任意の Microsoft Game Development Kit (GDK) プラットフォームでサポートされているキャンセルを通知する簡単な方法です。

Cancel ケースをトリガーするには、以下に示すようにタスクの非同期ブロックで XAsyncCancel を呼び出します。

XAsyncCancel(async);

関連項目

XAsyncProvider ライブラリの概要

カスタム プロバイダーのセットアップ (例)

呼び出しメソッドのセットアップ (例)

リターン データのセットアップ (例)

XAsyncProvider