분석을 주 기능으로 하는 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);
}
}