/// <summary> /// n フレーム後に F1(x)を返すコルーチン。 /// キャンセル機能付き。 /// </summary> /// <param name="x">入力値。</param> /// <param name="n">コルーチン稼働のフレーム数。</param> /// <param name="completed">完了時に呼ばれるデリゲート。</param> /// <param name="ct">キャンセル用トークン。</param> /// <returns></returns> public static System.Collections.IEnumerator F1Cancelable(double x, int n, Action<double> completed, CancellationToken ct) { for (int i = 0; i < n; i++) { // キャンセルへの対処はあくまでコルーチン側の債務 // 例外を出して止める。 ct.ThrowIfCancellationRequested(); yield return null; } completed(F1(x)); }
static System.Collections.IEnumerator Cancelで戻り値が切り替わるコルーチン(int n, Action<string> completed, CancellationToken ct) { var message = CompletedMessage; ct.Register(() => { message = CanceledMessage; }); for (int i = 0; i < n; i++) { if (ct.IsCancellationRequested) break; yield return null; } completed(message); }