많은 파일을 컬렉션에 추가하고 각각에 많은 작업을 수행하는 기능이 있습니다.C# UI Thread Unresponsive
이로 인해 프로그램 (주 스레드)이 응답하지 않게됩니다.
어떻게 원인을 파악하고 문제를 해결할 수 있습니까?
많은 파일을 컬렉션에 추가하고 각각에 많은 작업을 수행하는 기능이 있습니다.C# UI Thread Unresponsive
이로 인해 프로그램 (주 스레드)이 응답하지 않게됩니다.
어떻게 원인을 파악하고 문제를 해결할 수 있습니까?
다른 스레드를 사용하십시오.
Thread t = new Thread(new ThreadStart(() => {
IntensiveCalculationCode();
}));
t.Start();
또한 발송자를 호출하여 스레드 내부에서 UI 스레드를 호출 할 수도 있습니다. 그들은 Windows Forms와 WPF에서 정확히 동일하지 않습니다.
WPF를 사용하고 있는데 무엇이 다른가요? – user1430430
windows 폼에 정확히 기억이 안나지만 WPF에서 Dispatcher.Invoke (() => {CodeThatModifiesUIElementsSuchAsChangingTextboxText();})와 같은 디스패처를 호출 할 때 ' –
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 !
}
Great! – user1430430
다른 스레드에서 작업을 시작하십시오. 어떤 UI를 사용합니까? WinForms 또는 WPF? – opewix
배경 작업자를 사용하여 별도의 스레드에서 시간이 걸리므로 UI 스레드가 중단되지 않습니다. –