Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

C# - Task.Start 메서드 호출 시 "System.InvalidOperationException: 'Start may not be called on a task that has completed.'" 예외 발생

이 글은 다음의 질문에 대한 답변입니다.

[WPF] Task 관련 질문 드립니다.
; https://www.sysnet.pe.kr/3/0/5429

[WPF] Task 관련 재질문 드립니다.
; https://www.sysnet.pe.kr/3/0/5430

그러니까, 현상을 정리하면 다음과 같은 코드로 재현할 수 있습니다.

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        private CancellationTokenSource _cancelTask = new CancellationTokenSource();

        public MainWindow()
        {
            InitializeComponent();
        }

        Task _task;

        private void Connect_Click(object sender, RoutedEventArgs e)
        {
            _task = new Task((Action)myAction, _cancelTask.Token);
            _task.Start();
        }

        private void myAction()
        {
        }

        private void Disconnect_Click(object sender, RoutedEventArgs e)
        {
            _cancelTask.Cancel();
        }
    }
}

위의 코드에서 Connect_Click을 통해 Task.Start가 된 다음 Disconnect_Click으로 취소를 합니다. 그런데, 다시 Connect_Click이 실행되면 다음과 같은 예외가 발생합니다.

System.InvalidOperationException
  HResult=0x80131509
  Message=Start may not be called on a task that has completed.
  Source=mscorlib
  StackTrace:
   at System.Threading.Tasks.Task.Start(TaskScheduler scheduler) in f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs:line 1105
   at WpfApp1.MainWindow.Connect_Click(Object sender, RoutedEventArgs e) in C:\temp\WpfApp1\WpfApp1\MainWindow.xaml.cs:line 22
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
...[생략]...
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at WpfApp1.App.Main()

  This exception was originally thrown at this call stack:
    System.Threading.Tasks.Task.Start(System.Threading.Tasks.TaskScheduler) in Task.cs
    WpfApp1.MainWindow.Connect_Click(object, System.Windows.RoutedEventArgs) in MainWindow.xaml.cs
...[생략]...
    System.Windows.EventRoute.InvokeHandlersImpl(object, System.Windows.RoutedEventArgs, bool)
    ...
    [Call Stack Truncated]

왜냐하면, Task의 3번째 인자에 전달한 _cancelTask가 이전에 한번 Cancel 된 후에 다시 재사용되었기 때문입니다. 따라서, 위와 같은 경우에는 Task와 함께 취소 토큰도 새롭게 전달하면 됩니다.

private void Connect_Click(object sender, RoutedEventArgs e)
{
    _cancelTask = new CancellationTokenSource();
    _task = new Task((Action)myAction, _cancelTask.Token);
    _task.Start();
}




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 12/16/2020]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2020-12-16 06시19분
[종범] 토큰 재사용이 원인이였군요... ㅠㅠ
Task만 새로만들면 될 줄 알고 있었어요..;;

답변 감사드립니다!!!!
진짜 감사합니다.
[guest]

... 181  [182]  183  184  185  186  187  188  189  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
474정성태3/5/200724778.NET Framework: 84. Lambda 표현식 응용 사례 [1]
473정성태3/4/200731891디버깅 기술: 14. TFS 오류 추적(TF53010, TF14105)
472정성태3/3/200731040디버깅 기술: 13. 예외 발생 시 Minidump 생성 - WinDBG [3]파일 다운로드1
471정성태3/1/200720084디버깅 기술: 12. Managed Method에 Break Point 걸기
469정성태2/28/200731881디버깅 기술: 11. (Managed) Main Method에 Break Point 걸기 [3]파일 다운로드1
470정성태3/1/200723288    답변글 디버깅 기술: 11.1. (Managed) Main Method에 Break Point 걸기 - 내용 보강
468정성태2/25/200733057COM 개체 관련: 20. 탭 브라우저의 윈도우 핸들 구하기 [3]
466정성태2/22/200724847Windows: 23. 롱혼 서버 코어 버전 [2]
465정성태2/21/200723759오류 유형: 29. TFS 관련 스케줄 작업 실패
464정성태2/25/200725035오류 유형: 28. TF10217, TF53010, TF14105 오류
463정성태2/21/200717716Team Foundation Server: 15. 포탈 사이트의 보고서 주소를 도메인 명으로 적용
462정성태2/13/200745411.NET Framework: 83. 라이브러리에 다국어 리소스 추가 방법 [4]파일 다운로드1
461정성태2/13/200722804오류 유형: 27. DLinq 예제 오류 : error: 26 - Error Locating Server/Instance Specified
460정성태2/13/200723060.NET Framework: 82. Orcas 1월 CTP에서 Linq 소스 컴파일 방법
459정성태2/17/200727311오류 유형: 26. "Automatic Updates" 서비스 CPU 100% 점유 현상 - 두 번째 이야기 [3]
458정성태2/12/200723734.NET Framework: 81. LINQ 개발 환경 설정 [1]
457정성태2/8/200728237.NET Framework: 80. LINQ 관련 용어 정리 및 리소스 소개 [2]
456정성태2/6/200726514Windows: 22. 가상화에 대해서.
455정성태2/4/200721215오류 유형: 25. 원격 데스크톱 환경에서의 Virtual Server 관리 환경 제어
454정성태2/4/200718529오류 유형: 24. VPC에서의 Vista 네트워킹 문제
509손대성6/24/200720825    답변글 오류 유형: 24.1. [답변]: 오류 유형 : 23. VPC 에서의 Vista 네트워킹 문제
453정성태2/4/200726811개발 환경 구성: 21. 서버 측 SoapExtension을 클라이언트에 알리고 싶다
452정성태1/31/200726689VC++: 31. 비스타에서 VS.NET 2005로 COM 프로젝트 빌드시 오류 [2]
451정성태1/31/200725749Windows: 21. Preview Handler 소개
450정성태1/30/200734227VS.NET IDE: 43. .NET에서의 필수 무결성 제어 조절하는 방법 - Manifest 파일 이용파일 다운로드2
449정성태2/4/200730833Windows: 20. UAC 이모저모 [2]
... 181  [182]  183  184  185  186  187  188  189  190  191  192  193  194  195  ...