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
'C#' 카테고리의 다른 글
C# / Console system.io.ioexception (0) | 2022.06.10 |
---|---|
C# / 간단하게 로딩창 만들기. (0) | 2022.04.21 |
C# ListBox 아이템 글자 색상 변경 하기, ListBox 글자색 변경 (0) | 2022.03.24 |
C# / ListBox 정렬, 리스트박스 정렬 하기 (0) | 2022.03.22 |
C# / 공백 배열, 빈 배열 제거 하기 (0) | 2022.03.22 |