강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

0803nk님의 프로필 이미지
0803nk

작성한 질문수

C# 프로그래밍 기초부터 실전 활용까지

비동기(CancelationTokenSource - 1)

CancelationTokenSource 질문이있습니다.

작성

·

13

0

저 코드를 똑같이 적용했는데 저는 작업이 "중지되었습니다." 문구가 뜨고 확인을 누르면 바로 또 다른 스레드가 진행이됩니다;
그리고 3번 이미지 처럼 뜨는데 뭘잘못한지 모르겠습니다.

질의사항.png.webp

[코드]
using System.Runtime.CompilerServices;

using System.Windows.Forms;

namespace 20비동기_09_CancelationTokenSource_1_

{

public partial class Form1 : Form

{

private CancellationTokenSource? _cts;

public Form1()

{

InitializeComponent();

}

private async void btnStramAsync2_Click_1(object sender, EventArgs e)

{

if (_cts != null)

{

MessageBox.Show("작업이 진행중입다");

}

_cts = new CancellationTokenSource();

//한번 만들어지면 반드시 메모리를 삭제해주어야한다

try

{

await foreach (int i in GetIntsAsync(_cts.Token))

{

listbox2.Items.Add(i);

}

}

catch (TaskCanceledException ex)

{

MessageBox.Show("작업이 취소되었습니다.");

}

finally

{

_cts.Dispose();

_cts = null;

}

}

async IAsyncEnumerable<int> GetIntsAsync([EnumeratorCancellation] CancellationToken token)

{

{

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

{

await Task.Delay(1000, token);

yield return i;

}

}

}

private void btnStop2_Click_1(object sender, EventArgs e)

{

_cts?.Cancel();

}

}

}

 

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 0803nk님.

질문에서 언급하신 CancellationTokenSource 및 관련된 비동기 작업 진행 문제에 대해 설명드리겠습니다.

문제 설명

  1. NullReferenceException에러:

    • 이 에러는 객체가 null인 상태에서 접근을 시도할 때 발생합니다. 코드를 살펴보면, _cts 가 null이 아닌 상태에서만 작업이 진행중이라는 메시지를 띄우고, _cts를 생성합니다.
    • 작업이 시작되기 전에 _cts는 null일 수 있으므로, cts.Dispose();에서 오류가 발생할 수 있습니다.
  2. 연속된 작업 진행 문제:

    • “중지되었습니다.” 문구가 뜬 후, 작업이 다시 시작되는 경우는 _cts가 제대로 관리되지 않았을 가능성 때문입니다. _cts가 제대로 선언 및 해제되어야 다른 작업이 예기치 않게 시작되지 않게 할 수 있습니다.

해결 방법

  • _cts 초기화 확인:

    • _cts가 제대로 해제되지 않으면 메모리 릭이 발생할 수 있습니다. finally 블록에서 _cts를 null로 설정한 후 Dispose를 호출하면, 다음 작업 진행 시에 null 초기화 상태로 시작합니다.
  • 비동기 작업 관리:

    • 버튼 클릭 시에는 _cts가 이미 다른 작업에 사용 중이지 않도록 설계되어야 합니다. 그렇지 않으면, _cts가 null 상태임을 보장한 후에 CancellationTokenSource를 새로 생성해야 합니다.
  • 캔슬 버튼:

    • btnStop2_Click_1에서는 _cts?.Cancel();를 호출하여 작업을 중지할 수 있게 합니다. 이때도 _cts가 null이 아님을 미리 확인하는 것이 중요합니다.
  • 디버깅 팁:

    • 초기 null 상태 점검뿐 아니라, _cts의 상태를 추적(log)하여 변화 과정을 모니터링하면 문제 해결에 도움이 됩니다.

관련하여 더 구체적으로 다룬 예제와 설명을 제공하는 이전 게시물을 확인해 보세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0803nk님의 프로필 이미지
0803nk

작성한 질문수

질문하기