첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ 태스크 취소 옵션 사용하기

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

using System;

using System.Threading;

using System.Threading.Tasks;

 

...

 

#region 테스트 처리하기 - Test(taskName, secondCount, cancellationToken)

 

/// <summary>

/// 테스트 처리하기

/// </summary>

/// <param name="taskName">태스크명</param>

/// <param name="secondCount">초 카운트</param>

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

/// <returns>처리 결과</returns>

private int Test(string taskName, int secondCount, CancellationToken cancellationToken)

{

    Console.WriteLine

    (

        "[{0} 스레드] 태스크명 : {1}, 스레드 풀 스레드 여부 : {2}",

        Thread.CurrentThread.ManagedThreadId,

        taskName,

        Thread.CurrentThread.IsThreadPoolThread

    );

 

    for(int i = 0; i < secondCount; i ++)

    {

        Thread.Sleep(TimeSpan.FromSeconds(1));

 

        if(cancellationToken.IsCancellationRequested)

        {

            return -1;

        }

    }

 

    return secondCount;

}

 

#endregion

 

...

 

CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

 

Task<int> task = new Task<int>(() => Test("태스크 1", 10, cancellationTokenSource.Token), cancellationTokenSource.Token);

 

Console.WriteLine("태스크 상태 : {0}", task.Status);

 

cancellationTokenSource.Cancel();

 

Console.WriteLine("태스트 상태 : {0}", task.Status);

 

Console.WriteLine("첫번째 태스크가 실행 전 취소되었습니다.");

 

cancellationTokenSource = new CancellationTokenSource();

 

task = new Task<int>(() => Test("태스크 2", 10, cancellationTokenSource.Token), cancellationTokenSource.Token);

 

task.Start();

 

for(int i = 0; i < 5; i++ )

{

    Thread.Sleep(TimeSpan.FromSeconds(0.5));

 

    Console.WriteLine(task.Status);

}

 

cancellationTokenSource.Cancel();

 

for(int i = 0; i < 5; i++)

{

    Thread.Sleep(TimeSpan.FromSeconds(0.5));

 

    Console.WriteLine(task.Status);

}

 

Console.WriteLine("태스크가 완료되었습니다 : {0}.", task.Result);

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

Posted by 사용자 icodebroker

댓글을 달아 주세요