キャンセル処理を利用したタイムアウト(C Sharp)

提供:MochiuWiki : SUSE, EC, PCB
2021年11月15日 (月) 00:31時点におけるWiki (トーク | 投稿記録)による版 (文字列「<source lang」を「<syntaxhighlight lang」に置換)
ナビゲーションに移動 検索に移動

概要

C#で一定時間内に処理が終わらなければ終了または中断する処理を記載する。
Taskを生成して、一定時間後にキャンセル処理を実行する。
Taskまたはキャンセル処理のいずれかが完了したとき、処理を終了することでタイムアウトが実現できる。

サンプルコード

<syntaxhighlight lang="cpp">
public cancellationTask()
{
   var task = Task.Run(() =>
              {
                 // 何か処理
              });
   var cancellationCompletionSource = new TaskCompletionSource<bool>();
   using (var cts = new System.Threading.CancellationTokenSource(1000))
   using (cts.Token.Register(() => cancellationCompletionSource.TrySetResult(true)))
   {
      if (task != await Task.WhenAny(task, cancellationCompletionSource.Task).ConfigureAwait(false))
      {
         throw new OperationCanceledException(cts.Token);
      }
   }
}
</source>