C#
C# / 쓰레드, 타스크, Thread, Task 내부 메소드, 함수에서 await 대기중 Thread.IsAlive, Task.iscompleted 호출시 false 나오는 이유 및 해결법
캬옹냐옹
2022. 4. 15. 10:25
728x90
private void Form_Shown(object sender, EventArgs e)
{
serverTimer.Interval = 1000 * 1; //1000 = 1초, ms 단위
serverTimer.Elapsed += new ElapsedEventHandler(ServerConnectionTimer_Event); //이벤트 추가
serverTimer.Start();
}
private async void Run()
{
Debug.WriteLine("await Run");
await DoSomeThing(); // <- 이부분에서 Thread.IsAlive, task.IsCompleted 확인시 faㅣse 로 나옴
Debug.WriteLine("await End");
}
private void ServerConnectionTimer_Event(object sender, ElapsedEventArgs e) //Thread 사용시
{
if (!(Thread.IsAlive)) // Thread 동작 중이 아닐때 실행
{
Thread.Join();
Thread = new Thread(() => Run());
Thread.IsBackground = true; //부모 종료시 스레드 종료
Thread.Start();
}
}
private void ServerConnectionTimer_Event(object sender, ElapsedEventArgs e) //Task 사용시
{
if (!(task.IsCompleted)) // task 동작 중이 아닐때 실행
{
task = Task.Run(() => { Run(); });
}
}
타이머로 1초마다 쓰레드에 함수를 넣어서 동작을 시키는데
함수안에 있는 await 대기동안 Thread.IsAlive 확인시 false 로 나온다.
이유는 이렇다고 한다.
간단하게 await를 만나는 순간 다른 쓰레드가 되어서 그렇다고 한다.
private void Form_Shown(object sender, EventArgs e)
{
serverTimer.Interval = 1000 * 1; //1000 = 1초, ms 단위
serverTimer.Elapsed += new ElapsedEventHandler(ServerConnectionTimer_Event); //이벤트 추가
serverTimer.Start();
}
private async Task<bool> Run()
{
Debug.WriteLine("await Run");
await DoSomeThing(); // <- 이부분에서 Thread.IsAlive, task.IsCompleted 확인시 faㅣse 로 나옴
Debug.WriteLine("await End");
return true;
}
bool runCheck = true;
private void ServerConnectionTimer_Event(object sender, ElapsedEventArgs e) //Task 사용시
{
if (runCheck == false) //Run 메소드 반환값 확인해서 실행중인지 확인
{
Debug.WriteLine($"ss: {runCheck}");
return;
}
runCheck = false;
Task.Run(async () => { runCheck = await Run(); });
}
그래서 쓰레드 동작 체크가 아닌 메소드 반환값을 체크하는 방식으로 메소드가 동작중인지 확인하는 방식으로
변경 했다.
다른 더 간단한 방법이 있으면 댓글 부탁드립니다.
728x90