> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# キャンセル可能性のセットアップ例

> Cancel ケースでイベントをシグナル状態にし、DoWork を E_ABORT で終了させてカスタム非同期プロバイダーにキャンセルのサポートを追加し、XAsyncCancel でキャンセルをトリガーします。

このトピックでは、カスタム プロバイダー コールバックでキャンセル可能性をセットアップする方法の例を示します。[XAsyncRun](https://docs.xbox.com/ja-jp/reference/system/xasync/functions/xasyncrun.md) で開始される基本的な非同期メソッドはキャンセルできません。カスタム プロバイダーを使用している場合には、キャンセル可能性のサポートを手動で追加できます。サポートを追加すると、[XAsyncCancel](https://docs.xbox.com/ja-jp/reference/system/xasync/functions/xasynccancel.md) によって `Cancel` ケースがトリガーされます。

```c++ theme={null}
// 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](https://docs.xbox.com/ja-jp/reference/system/xasyncprovider/functions/xasynccomplete.md) の呼び出しで終了します。キャンセルの通知には任意の方法を使用できますが、イベントは、対象にできるすべての Microsoft Game Development Kit (GDK) プラットフォームでサポートされている、キャンセルを通知する単純な方法です。

`Cancel` ケースをトリガーするには、次のように、タスクの非同期ブロックを指定して `XAsyncCancel` を呼び出します。

```c++ theme={null}
XAsyncCancel(async);
```

## リファレンス API ドキュメント

* [XAsyncProvider (API 目次)](https://docs.xbox.com/ja-jp/reference/system/xasyncprovider/xasyncprovider_members.md)
  * 関数
    * [XAsyncComplete](https://docs.xbox.com/ja-jp/reference/system/xasyncprovider/functions/xasynccomplete.md)
* [xasync (API 目次)](https://docs.xbox.com/ja-jp/reference/system/xasync/xasync_members.md)
  * 関数
    * [XAsyncRun](https://docs.xbox.com/ja-jp/reference/system/xasync/functions/xasyncrun.md)
    * [XAsyncCancel](https://docs.xbox.com/ja-jp/reference/system/xasync/functions/xasynccancel.md)

## 関連項目

[XAsyncProvider ライブラリの概要](https://docs.xbox.com/ja-jp/build/core-features/common/async/async-libraries/async-library-xasyncprovider.md)

[カスタム プロバイダーのセットアップ (例)](https://docs.xbox.com/ja-jp/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-custom-provider.md)

[呼び出しメソッドのセットアップ (例)](https://docs.xbox.com/ja-jp/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-invocation-methods.md)

[戻りデータのセットアップ (例)](https://docs.xbox.com/ja-jp/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-return-data.md)

[XAsyncProvider](https://docs.xbox.com/ja-jp/reference/system/xasyncprovider/xasyncprovider_members.md)


## Related topics

- [非同期タスク プログラミング向け XAsync ライブラリ](https://docs.xbox.com/ja-jp/build/core-features/common/async/async-libraries/index.md)
- [戻りデータのセットアップ例](https://docs.xbox.com/ja-jp/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-return-data.md)
- [呼び出しメソッドのセットアップ例](https://docs.xbox.com/ja-jp/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-invocation-methods.md)
- [XAsyncProvider ライブラリの概要](https://docs.xbox.com/ja-jp/build/core-features/common/async/async-libraries/async-library-xasyncprovider.md)
- [非同期タスクのセットアップ例](https://docs.xbox.com/ja-jp/build/core-features/common/async/async-libraries/async-library-xasync-example-setup-async-task.md)
