비동기 방법에서 비동기 조작 취소

1. 비동기적인 방법에서 비동기적인 조작을 취소한다. 첫 번째 단계는CancellationToken과CancellationTokenSource 두 종류의 대상을 성명하고 두 종류를CancellationTokenSource 대상의token 속성을 통해 관련시켜야 한다.
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token; // CancellationTokenSource cts CancellationToken token 

2. CancellationTokenSource의 Cancel() 방법을 호출하여 비동기적 방법 또는 비동기적 방법 중의 await 표현식 중의 CancellationToken의 IsCancellationRequested 속성을 True로 하여 비동기적 방법 또는 비동기적 방법 중의 await 표현식의 집행을 중지한다.
 public async Task RunAsync(CancellationToken ct)// CancellationToken 
        {
            if(ct.IsCancellationRequested)
            {
                return;
            }
            await Task.Run(() => CycleMethod(ct), ct);//public static Task Run(Action action, CancellationToken cancellationToken); Action , CycleMethod 
        }                                             // Run 

3. 비동기적 방법이나 비동기적 방법 중의 await 표현식은 모두 CancellationToken 유형의 참조를 포함하고 프로그램이CancellationTokenSource류의 Cancel() 방법을 호출하면 비동기적 방법과 await 표현식에서 CancellationToken의 IsCancellationRequested 속성이 True로 검출되면 종료된다.
프로그램 1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace _CancellationToken
{
    class Program
    {
        static void Main(string[] args)
        {
            CancellationTokenSource cts = new CancellationTokenSource();
            CancellationToken token = cts.Token;        // CancellationTokenSource cts CancellationToken token 
            MyClass mc = new MyClass();
            Task t = mc.RunAsync(token);
            Thread.Sleep(3000);// 3 
            cts.Cancel();
            t.Wait();
            Console.WriteLine("Was Cancelled: {0}",token.IsCancellationRequested);
            Console.ReadKey();
        }
    }
    class MyClass
    {
        public async Task RunAsync(CancellationToken ct)// CancellationToken 
        {
            if(ct.IsCancellationRequested)
            {
                return;
            }
            await Task.Run(() => CycleMethod(ct), ct);//public static Task Run(Action action, CancellationToken cancellationToken); Action , CycleMethod 
        }                                             // Run 

        void  CycleMethod(CancellationToken ct)
        {
            Console.WriteLine("Starting CycleMethod");
            const int Max = 5;
            for (int i = 0; i < Max; i++)
			{
                if (ct.IsCancellationRequested)
                {
                    return;
                }
                Thread.Sleep(1000);
                Console.WriteLine("   {0} of {1} iterations completed",i+1,Max);
			}
        }
    }
}

프로그램 2:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Process
{
    public partial class Form1 : Form
    {
        CancellationTokenSource _cancellationTokenSource;
        CancellationToken _cancellationToken;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }
       

        private async  void btnprocess_Click(object sender, EventArgs e)
        {
            btnprocess.Enabled = false;
            _cancellationTokenSource = new CancellationTokenSource();
            _cancellationToken = new CancellationToken();
            _cancellationToken = _cancellationTokenSource.Token;                 // _cancellationTokenSource _cancellationToken 

            int completedPercent = 0;
            for (int i = 0; i < 10; i++)
            {
                if (_cancellationToken.IsCancellationRequested)
                {
                    break;
                }
                try                                                              // await 
                {
                    await Task.Delay(500, _cancellationToken);                    //await Task.Delay(50);  
                    //Thread.Sleep(1000);
                    completedPercent = (i+1)*10;
                }
                catch (TaskCanceledException ex)
                {
                    completedPercent = i * 10;
                }
                progressBar1.Value = (i+1) * 10;                                 // 
                this.textBox1.Text = progressBar1.Value.ToString();              //Text 
            }
            string message = _cancellationToken.IsCancellationRequested ? string.Format("Process was canceled at {0}%", completedPercent) : "Process completed normally";
            MessageBox.Show(message,"Completion Status");
            progressBar1.Value = 0;
            btnprocess.Enabled = true;
            btnCancel.Enabled = true;
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            if (!btnprocess.Enabled)
            {
                btnCancel.Enabled = false;
                _cancellationTokenSource.Cancel();                             // CancellationTokenSource Cancel CancellationToken IsCancellationRequested True , 
                this.textBox1.Text = "";
            }
        }
    }
}

 
 
 

좋은 웹페이지 즐겨찾기