인프런 커뮤니티 질문&답변
CancelationTokenSource 질문이있습니다.
작성
·
13
0
저 코드를 똑같이 적용했는데 저는 작업이 "중지되었습니다." 문구가 뜨고 확인을 누르면 바로 또 다른 스레드가 진행이됩니다;
그리고 3번 이미지 처럼 뜨는데 뭘잘못한지 모르겠습니다.

[코드]
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 및 관련된 비동기 작업 진행 문제에 대해 설명드리겠습니다.
문제 설명
NullReferenceException에러:
- 이 에러는 객체가 null인 상태에서 접근을 시도할 때 발생합니다. 코드를 살펴보면,
_cts가 null이 아닌 상태에서만 작업이 진행중이라는 메시지를 띄우고,_cts를 생성합니다.
- 작업이 시작되기 전에
_cts는 null일 수 있으므로,cts.Dispose();에서 오류가 발생할 수 있습니다.
- 이 에러는 객체가 null인 상태에서 접근을 시도할 때 발생합니다. 코드를 살펴보면,
연속된 작업 진행 문제:
- “중지되었습니다.” 문구가 뜬 후, 작업이 다시 시작되는 경우는
_cts가 제대로 관리되지 않았을 가능성 때문입니다._cts가 제대로 선언 및 해제되어야 다른 작업이 예기치 않게 시작되지 않게 할 수 있습니다.
- “중지되었습니다.” 문구가 뜬 후, 작업이 다시 시작되는 경우는
해결 방법
_cts초기화 확인:_cts가 제대로 해제되지 않으면 메모리 릭이 발생할 수 있습니다.finally블록에서_cts를 null로 설정한 후 Dispose를 호출하면, 다음 작업 진행 시에 null 초기화 상태로 시작합니다.
비동기 작업 관리:
- 버튼 클릭 시에는
_cts가 이미 다른 작업에 사용 중이지 않도록 설계되어야 합니다. 그렇지 않으면,_cts가 null 상태임을 보장한 후에CancellationTokenSource를 새로 생성해야 합니다.
- 버튼 클릭 시에는
캔슬 버튼:
btnStop2_Click_1에서는_cts?.Cancel();를 호출하여 작업을 중지할 수 있게 합니다. 이때도_cts가 null이 아님을 미리 확인하는 것이 중요합니다.
디버깅 팁:
- 초기 null 상태 점검뿐 아니라,
_cts의 상태를 추적(log)하여 변화 과정을 모니터링하면 문제 해결에 도움이 됩니다.
- 초기 null 상태 점검뿐 아니라,
관련하여 더 구체적으로 다룬 예제와 설명을 제공하는 이전 게시물을 확인해 보세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





