음을, 나는 버튼이있는 Form1을 가지고 있고이 버튼 중 하나를 클릭하면 그것은 Form1에C# 스레딩은 여전히 UI 응답하지
UserControl1을이 데이터베이스와 같은 많은 데이터를 포함에 패널로 UserControl을로드 것, 차트 및 그림 상자도. 따라서로드하는 동안 사용자 인터페이스가 확실히 응답하지 않게됩니다.
일부 기사를 읽었으므로 다른 스레드를 통해 실행해야한다는 것을 알았 기 때문에 약간의 성능 향상을 보았습니다.
usercontrol1은 약 3-5 초 동안 GUI를 응답하지 않게 만들고 데이터가 커지면 어떻게합니까? 당신이 이것에 대해 좀 도와 경우
private void click_dashb_Click(object sender, EventArgs e)
{
ParameterizedThreadStart pts = new ParameterizedThreadStart(load_UserControl);
Thread t = new Thread(pts);
t.Start();
//Animated Picturebox to show user that UI is loading
pictureBox1.Enabled = true;
hover.Location = new Point(42, 130);
}
private void load_UserControl(object state)
{
Invoke(new Action(() =>
{
//load user control through another thread
while (panel1.Controls.Count > 0)
panel1.Controls[0].Dispose();
Home frm = new Home();
frm.AutoScroll = true;
panel1.Controls.Add(frm);
frm.Show();
}));
//Stop the animated GIF means the load is finish!
pictureBox1.Enabled = false;
}
: 그 마무리 로딩 여기
내 코드의 경우
이 나는 반응하고 여전히 애니메이션의 PictureBox를 실행하여로드 사용자에게 표시하고 중지하려면 문제. 나는 모든 작품에 적용 할 수 있습니다. 대부분의 데이터에는 큰 데이터가 포함되어 있기 때문입니다.
덕분에 유래 커뮤니티 :
편집 :
배경 노동자를 사용하는 제안 코멘트를 읽은 후. 나는 그것을 사용하려고 노력했다.
private void click_dashb_Click(object sender, EventArgs e)
{
bgw.RunWorkerAsync();
}
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
try
{
BeginInvoke((MethodInvoker)delegate
{
while (panel1.Controls.Count > 0)
panel1.Controls[0].Dispose();
Home frm = new Home();
frm.AutoScroll = true;
panel1.Controls.Add(frm);
frm.Show();
});
}
catch (Exception x)
{
MessageBox.Show("An error occured while performing operation" + x);
}
}
private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
}
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("Operation Cancelled");
}
else
{
MessageBox.Show("Operation Completed");
}
}
그것은 조금 더 나은하지만 난 아직도 조금 무 반응을 얻었다 :하지만 여전히 조금 응답하지 않는 을 받고 여기에 새로운 코드입니다. 내 코드를 확인하고이 코드의 문제점을 찾아 낼 수 있습니까?
다시 한번 감사
Invoke 함수는 기본 AKA UI 스레드에서 실행 된 대리자 매개 변수를 제공합니다. –
그 스레드가 단지 'Invoke'에있는 모든 활동을 감싸고 있다면 새 스레드를 생성 할 필요가 없습니다. Invoke의 요점은 활동을 UI 스레드로 마샬링하는 것입니다. –
BackgroundWorker를 보면이 문제를 해결하기 위해 특별히 설계되었으므로 자체 스레드를 만들 필요가 없습니다. – Paolo