C#) Invoke란?

jiyul·2023년 11월 15일
0

C#

목록 보기
11/21

새로운 스레드를 하나 생성한다.

// DataGridView 업데이트 시작
m_ThreadUpdateDateGrid = new Thread(new ThreadStart(UpdateDataGrid));
m_ThreadUpdateDateGrid.IsBackground = true;
m_ThreadUpdateDateGrid.Start();

생성한 새로운 스레드에서 Form UI를 건드리면 크로스 스레드 에러가 난다.

Form UI는 그 UI가 생성된 메인 스레드에서 관리하므로(?) Invoke를 사용해 메인 스레드에게 해당 작업을 넘겨줄 수 있다고 생각하고 있다.

그래서 새로운 스레드에서 UI 작업을 해야하면, UI 작업 코드만 따로 메서드로 구분한 후

InvokeRequired-> 인보크가 요구되는지 체크
Invoke를 사용해 UI 작업을 할 수 있도록 하고

Invoke를 쓰는 동안은 메인 스레드가 작업을 하므로
시간이 오래걸리는 작업을 하면 Form UI가 멈추는 현상이 있을 수 있으므로
Invoke 내의 코드는 UI와 관련된 코드만 넣도록 한다.

private void UpdateDataGrid()
{
    while (true)
    {
        Thread.Sleep(1000);
        UpdateInvokeDataGrid();
    }
}

private void UpdateInvokeDataGrid()
{
    if (this.dataGridView.InvokeRequired)
    {
        this.dataGridView.Invoke(new MethodInvoker(delegate { UpdateInvokeDataGrid(); }));
        return;
    }
    
    this.dataGridView.DataSource = new DataTable();
}
profile
Let's take the lead

0개의 댓글

관련 채용 정보