キャンセル機能のセットアップの例
このトピックでは、カスタム プロバイダー コールバックのキャンセル機能をセットアップする方法の例を示します。
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);