■ CancellationToken 클래스 : 작업 취소시키기

------------------------------------------------------------------------------------------------------------------------


TestProject.zip


Program.cs

 

 

using System;

using System.Numerics;

using System.Threading;

using System.Threading.Tasks;

using System.Timers;

 

namespace TestProject

{

    /// <summary>

    /// 프로그램

    /// </summary>

    class Program

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Private

 

        #region Field

 

        /// <summary>

        /// 타이머

        /// </summary>

        private static System.Timers.Timer _timer = new System.Timers.Timer();

 

        /// <summary>

        /// 취소 토큰 소스

        /// </summary>

        private static CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Private

        ////////////////////////////////////////////////////////////////////// Event

 

        #region 타이머 경과시 처리하기 - timer_Elapsed(sender, e)

 

        /// <summary>

        /// 타이머 경과시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private static void timer_Elapsed(object sender, ElapsedEventArgs e)

        {

            _timer.Stop();

 

            _cancellationTokenSource.Cancel();

 

            Console.WriteLine("JOB CANCELED");

        }

 

        #endregion

 

        ////////////////////////////////////////////////////////////////////// Function

 

        #region 프로그램 시작하기 - Main()

 

        /// <summary>

        /// 프로그램 시작하기

        /// </summary>

        /// <returns>태스크</returns>

        private static async Task Main()

        {

            Console.Title = "CancellationToken 클래스 : 작업 취소시키기";

 

            Console.WriteLine("BEGIN FUNCTION MAIN");

 

            _timer.Interval = 3000;

 

            _timer.Elapsed += timer_Elapsed;

 

            _timer.Start();

 

            await ProcessJobAsync(long.MaxValue - 1, _cancellationTokenSource.Token);

 

            Console.WriteLine("END FUNCTION MAIN");

        }

 

        #endregion

 

        #region 합계 구하기 - GetSummary(count, token)

 

        /// <summary>

        /// 합계 구하기

        /// </summary>

        /// <param name="count">카운트</param>

        /// <param name="token">취소 토큰</param>

        /// <returns>합계</returns>

        private static BigInteger GetSummary(long count, CancellationToken token)

        {

            BigInteger summary = 0;

 

            for(long i = 0; i < count; i++)

            {

                if(token.IsCancellationRequested == true)

                {

                    break;

                }

 

                i++;

 

                summary += i;

            }

 

            return summary;

        }

 

        #endregion

        #region 비동기 작업 처리하기 - ProcessJobAsync(count, token)

 

        /// <summary>

        /// 비동기 작업 처리하기

        /// </summary>

        /// <param name="count">카운트</param>

        /// <param name="token">취소 토큰</param>

        /// <returns>태스크</returns>

        private static async Task ProcessJobAsync(long count, CancellationToken token)

        {

            Console.WriteLine("BEGIN PROCESS JOB");

 

            await Task.Factory.StartNew(() => GetSummary(count, token));

 

            if(!token.IsCancellationRequested)

            {

                Console.WriteLine("JOB COMPLETED");

            }

 

            Console.WriteLine("END PROCESS JOB");

        }

 

        #endregion

    }

}

 

------------------------------------------------------------------------------------------------------------------------

※ Main 함수에서 async를 사용하기 위해서 프로젝트 [속성]의 [빌드] 탭에서 [고급] 버튼을 클릭하고 [고급 빌드 설정] 대화 상자의 [언어 버전] 항목을 "C# 7.1"로 설정해야 한다.

Posted by 사용자 icodebroker