C#_Task の処理を止める

Task.Run の外から止めたい。
中からなら Task.Run(() => { // 処理 ;});  の  {   } の中で
条件分岐をかいて return すればよい。

 

・CancellationTokenSource.Cancel( ) を使う方法、
ContinueWith でキャンセル処理を行う方法、
・CancellationTokenSource.Cancel(Boolean) を使う方法がある。

どのみち CancellationTokenSource は使う

 

CancellationTokenSource.Cancel を使う

 

ex )

    private CancellationTokenSource _cancelSource = null;
   
    private void Stop_Click(object sender, EventArgs e)
    {
        if (_cancelSource != null)
        {
            _cancelSource.Cancel( );
        }
    }
   
    private void Hoge()
    {
        if (_cancelSource == null)
        {
            _cancelSource = new CancellationTokenSource( );
        }
        var token = _cancelSource.Token;
       
        var result = Task.Run(() =>
        {
            // token.ThrowIfCancellationRequested( );
            if (token.IsCancellationRequested)
            {
                // キャンセル処理
                return;
            }
           
            // なんかの処理
           
        }, token).ContinueWith(t =>
        {
            //後始末
            _cancelSource.Dispose( );
            _cancelSource = null;
           
            /*
            if(t.IsCanceled)
            {
                //キャンセル処理
            }
            */
           
        });
    }
   
   
    private void Start_Click(object sender, EventArgs e)
    {
        Hoge( );
    }

 

CancellationTokenSource.Cancel( )

このメソッドを使うと CancellationToken に通知が飛ぶが
何も起こらない
非同期中に IsCancellationRequested プロパティを確認する必要がある。

 

 

キャンセル処理を ContinueWith で行う

CancellationToken.ThrowIfCancellationRequeste( ) を使う。
↑ソースでコメントアウトしている箇所。

 

if (token.IsCancellationRequested) { 処理 } の部分が

token.ThrowIfCancellationRequested();

if(t.IsCanceled) { 処理  }

に変わる。

 token.ThrowIfCancellationRequested(); は、
キャンセル通知がきたら例外を投げてタスクを終了させる。

 if (token.IsCancellationRequested) を書く箇所が多く、キャンセル処理内容が同じ時使えるかと。

 

 

CancellationTokenSource.Cancel(Boolean) を使う

token.ThrowIfCancellationRequested();

if (token.IsCancellationRequested)

が不要になる

if(t.IsCanceled) {  } は必要

 

private void Stop_Click メソッドで、

    if (_cancelSource != null)
    {
        _cancelSource.Cancel(true);
    }

即例外を投げてキャンセルしている。

 

 

こちらから。
http://outofmem.hatenablog.com/entry/2014/04/02/014201
http://mslgt.hatenablog.com/entry/2017/10/08/091841

 

以上。