wpf 비동기 Task 중지하는 방법

Eden·2023년 5월 11일
0

분석을 주 기능으로 하는 SW개발중 편의상 시간이 오래걸리는 분석을 중간에 중지시키는 기능이 필요했다

private CancellationTokenSource _cancellationTokenSource; // 신호를 주면 Task에 Cancel 예외처리를 해줌

_cancellationTokenSource = new CancellationTokenSource(); // 분석이 시작하는 곳에 이 코드를 심어준다.

private void CancelButton() // 취소버튼에 사용
{
	if (ConfirmMsgShow("분석을 중지하면 데이터가 초기화 됩니다. 중지하시겠습니까?", "분석 중지"))
    {
    	if(_cancellationTokenSource != null)
        	_cancellationTokenSource.Cancel();
        
    }
    else
    {

	}
}

public void CancelTask()
{
	if( _cancellationTokenSource != null && _cancellationTokenSource.Token != null)
    		_cancellationTokenSource.Token.ThrowIfCancellationRequested();
            //해당 Task에 예외를 던져 Task를 중단시킴
}   

분석 코드 내 오래걸리는 로직 부분부분에 CancelTask() 함수를 넣어준다.

		public async Task CheckingTask(Task analysis) 
        {
            Task task = analysis; // 비동기 작업
            bool pass = false;
            while (!pass) // 작업이 완료 또는 실패하거나 강제로 취소 시킬때 까지 상태를 계속 확인
            {
                if (task.Status == TaskStatus.WaitingForChildrenToComplete)
                {
                    //Console.WriteLine("Task is running...");
                } 
                else if (task.Status == TaskStatus.Faulted || task.Status == TaskStatus.Canceled)
                {
                    pass = true;
                }
                else if (task.Status == TaskStatus.WaitingForActivation)
                {
                    //Console.WriteLine("Task is running...");
                }
                else if (task.IsCompleted)
                {
                    pass = true;
                }
                await Task.Delay(500); 
            }
        }
profile
주섬주섬..

0개의 댓글