2009-09-30 5 views
1

단추를 누를 때 결과 집합을 반복하고이 결과 집합에 대한 작업을 수행하는 간단한 프로그램이 있습니다 (DataTable에 저장 됨). 루프 중에 RichTextBox, 2 개의 레이블 및 ToolStripStatusLabel의 텍스트를 업데이트합니다. 이것들은 루프 동안 리프레시되지 않으므로 각 아이템이 루프에서 처리 된 후에 this.Refresh()을 수행합니다. 프로그램에서 아무 것도 클릭하지 않으면 작동하지 않습니다. 응답이 없으며 foreach 루프가 완료 될 때까지는 아무 것도 새로 고쳐지지 않습니다..NET Windows Forms 새로 고침 제어

private void myBtn_Click(object sender, EventArgs e) 
{ 
    // Query database and store results in DataTable dt. 

    foreach (DataRow dr in dt.Rows) 
    { 
     // Process row data. 
     // Update RichTextBox, labels, and ToolStripStatusLabel. 
     this.Refresh(); 
    } 
} 

여기에 문제가 있습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까? 이것은 C#을 사용하는 Windows Forms 응용 프로그램입니다.

답변

5

"응답하지 않음"이란 말은 GUI 스레드를 묶어두고 있기 때문입니다. 수행 시간이 길다면 백그라운드 스레드를 대신 사용해보십시오.

시작하려면 BackgroundWorker을 확인하십시오.

여기에 threading tutorial이 있습니다.

+0

이 논리를 백그라운드 스레드로 옮기면 그 스레드에서도 잠그지 않을 것입니까? 아니면 배경 스레드에서 메인 스레드에서 this.Refresh를 호출할까요? –

+0

백그라운드 스레드가 사용 중이지만 GUI에 영향을 미치지 않습니다 (프로그램은 계속 실행됩니다). 백그라운드 스레드에서 GUI를 변경하려면 Invoke (또는 BeginInvoke)를 사용해야합니다. –

+0

백그라운드 작업자에서이 논리를 처리하고 대리인/호출로 UI를 업데이트하여 정상적으로 작동합니다. 감사합니다 –