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

+ Recent posts