새로운 스레드를 하나 생성한다.
// 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();
}