일반적인 규칙은 다음과 같습니다 는 UI 스레드
윈도우 (뿐만 아니라 윈도우 CE에서)의 UI 비동기 성격을 가지고에 차단 아무것도 할 수 없다. 즉, 대부분의 API 호출이 즉시 수행해야하는 작업을 수행하지는 않습니다. 대신 이벤트 대기열에 넣고 나중에 이벤트 펌프로 검색하는 일련의 이벤트를 생성합니다.이 이벤트 펌프는 본질적으로 UI 스레드에서 실행되는 무한 루프이며 하나씩 대기열에서 이벤트를 선택하고 처리합니다. .
위에서 결론을 내리면 특정 작업 (예 : 귀하의 경우에 윈도우 표시)을 요청한 후에도 UI 스레드에서 오랜 시간 일을 계속하면 이벤트 펌프가 이벤트를 선택할 수 없습니다 당신은 그것에 통제권을 돌려주지 않았기 때문에, 당신의 요청 된 행동은 완료 될 수 없습니다.
일반적인 접근 방식은 다음과 같습니다. 복잡한 데이터 변환 /로드/준비/모든 작업을 수행해야하는 경우 별도의 스레드에서 수행 한 다음 Control.BeginInvoke를 사용하여 UI 스레드에 대리자를 주입하고 해당 델리게이트 내부의 실제 UI 컨트롤.
멀티 스레딩이 가져 오는 "복잡성"에 대한 비합리적 인 두려움에도 불구하고 두려워 할 점은 거의 없습니다. 여기에 포인트를 설명하기 위해 약간의 예입니다 : 당신이 다른 솔루션 놀 수 있지만
public void ShowUI()
{
theForm = new MyForm();
theForm.Show();
// BeginInvoke() will take a new thread from the thread pool
// and invoke our delegate on that thread
new Action(PrepareData).BeginInvoke(null,null);
}
public void PrepareData()
{
// Prepare your data, do complex computation, etc.
// Control.BeginInvoke will put our delegate on the UI event queue
// to be retrieved and executed on the UI thread
theForm.BeginInvoke(new Action(PutDataInTheForm));
}
public void PutDataInTheForm()
{
theForm.textBox1.Text = "data is ready!";
}
는 일반적인 생각은 항상 동일하게 유지 : 당신은 UI 스레드에서 긴 아무것도 할 경우, 당신의 UI가 "정지"됩니다. 다시 그리기는 비동기 프로세스이기 때문에 화면에 새 UI 요소를 추가해도 자체가 다시 그려지지 않습니다.
따라서 복잡한 스레드와 긴 스레드는 별도의 스레드에서 수행해야하며 UI 스레드에서 빠른 작업을 보장하는 간단하고 작은 작업 만 수행해야합니다. 정말로 다른 대안은 없습니다.
희망이 도움이됩니다.
이처럼 어리석은 것으로서 Application.DoEvents() 정적 메서드는 추가 스레드를 사용할 필요없이 문제를 해결합니다. "UI가 멈추는 등의 원인이 될 수 있지만 이것이 필요한만큼 충분합니다. –