2012-09-11 3 views
1

많은 파일을 컬렉션에 추가하고 각각에 많은 작업을 수행하는 기능이 있습니다.C# UI Thread Unresponsive

이로 인해 프로그램 (주 스레드)이 응답하지 않게됩니다.

어떻게 원인을 파악하고 문제를 해결할 수 있습니까?

+0

다른 스레드에서 작업을 시작하십시오. 어떤 UI를 사용합니까? WinForms 또는 WPF? – opewix

+6

배경 작업자를 사용하여 별도의 스레드에서 시간이 걸리므로 UI ​​스레드가 중단되지 않습니다. –

답변

0

다른 스레드를 사용하십시오.

Thread t = new Thread(new ThreadStart(() => { 
    IntensiveCalculationCode(); 
})); 

t.Start(); 

또한 발송자를 호출하여 스레드 내부에서 UI 스레드를 호출 할 수도 있습니다. 그들은 Windows Forms와 WPF에서 정확히 동일하지 않습니다.

+0

WPF를 사용하고 있는데 무엇이 다른가요? – user1430430

+0

windows 폼에 정확히 기억이 안나지만 WPF에서 Dispatcher.Invoke (() => {CodeThatModifiesUIElementsSuchAsChangingTextboxText();})와 같은 디스패처를 호출 할 때 ' –

1

BackgroundWorker 개체를 사용하십시오. ReportProgress 및 ProgressChanged 이벤트를 사용하여 작업 진행률을 사용자에게 알릴 수 있습니다.

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    backgroundWorker1.WorkerReportsProgress = true; 
    backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 

    // .. stuff that takes long 

    backgroundWorker1.ReportProgress(10); 

    // .. stuff that takes long 

    backgroundWorker1.ReportProgress(20); 

    // .. stuff that takes long 

    backgroundWorker1.ReportProgress(100); 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // Done ! 
} 
+0

Great! – user1430430