いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

.NET クラスライブラリ探訪-067 (System.Threading.CancellationTokenSource, CancelAfter, .NET 4.5から追加されたメソッド)

.NET 4.5にて、CancellationTokenSourceクラスに以下のメソッドが追加されました。

CancellationTokenSource.CancelAfter メソッド

CancelltionTokenSourceやCancellationTokenについては
以前に記事を書いておりますので、そちらを参照下さい。

で、今回追加されたCancelAfterメソッドですが、名前の通り指定した時間待機した後で
キャンセルを発生させます。指定できるのは、Int32かTimeSpanです。

以下、サンプルです。

namespace Sazare.Samples
{
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Threading;
  using System.Threading.Tasks;
  
  using Sazare.Common;

  /// <summary>
  /// CancellationTokenとCancellationTokenSourceについてのサンプルです。
  /// </summary>
  /// <remarks>
  /// .NET 4.5から追加されたCancelAfterメソッドのサンプルです。
  /// </remarks>
  [Sample]
  class CancellationTokenSamples02 : IExecutable
  {
    public void Execute()
    {
      //
      // .NET 4.5からCancellationTokenSourceにCancelAfterメソッド
      // が追加された。CancelAfterメソッドは、指定時間後にキャンセル
      // 処理を行うメソッドとなっている。
      //
      // CancellationTokenSource.CancelAfter メソッド 
      //   http://msdn.microsoft.com/ja-jp/library/hh194678(v=vs.110).aspx
      //
      // 引数には、Int32またはTimeSpanが指定できる。
      //
      var tokenSource = new CancellationTokenSource();
      var token       = tokenSource.Token;

      Action action = () =>
      {
        while (true)
        {
          if (token.IsCancellationRequested)
          {
            Output.WriteLine("Canceled!");
            break;
          }

          Output.Write(".");
          Thread.Sleep(TimeSpan.FromSeconds(1));
        }
      };

      var task = Task.Run(action, token);

      //
      // 3秒後にキャンセル
      //
      tokenSource.CancelAfter(TimeSpan.FromSeconds(3));
      task.Wait();

      tokenSource.Dispose();
    }
  }
}

実行すると以下のようになります。
指定した時間後にキャンセル処理されているのが分かります。

================== START ==================
...Canceled!
==================  END  ==================

以下、参考資料です。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。