Sekme denetimi ve birkaç sekme içeren bir C# WinForms uygulamasına sahibim. Sekmelerden biri bir veri ızgarası kontrolü içerir - sadece yaklaşık 10 elemanı vardır, ancak veriler birden fazla sunucuyu sorgulayarak doldurulur ve bu nedenle yüklenmesi yavaştır.Bir datagrid denetimini doldururken iletiyi bekleyin
Uygulamamı çalıştırdığımda ve datagrid denetimi ile sekmeyi seçtiğimde, uygulama tüm sunucuları sorgulamaya ve ızgaraya nüfuz etmeye çalışırken uygulama askıda gibi görünüyor.
Asmak yerine uygulamanın yanıt vermesini istiyorum ve bunun için "lütfen bekle ..." mesajını görüntüleyelim, bu durum datagrid'in doldurulmasından sonra kaybolacaktır. Ben yapmaya çalıştım ne
gibi bir arka plan işçi yaratmaktır:
if (tabctrl.SelectedTab == tabctrl.TabPages["tabServices"])
{
this.dgrdServices.RowPrePaint += new DataGridViewRowPrePaintEventHandler(dgrdServices_RowPrePaint);
this.dgrdServices.CellContentClick += new DataGridViewCellEventHandler(dgrdServices_CellClick);
BackgroundWorker bw = new BackgroundWorker();
lblLoading.Visible = true;
bw.RunWorkerAsync();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
PopulateServicesDataGrid();
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lblLoading.Visible = false;
}
private void PopulateServicesDataGrid()
{
int x = 0;
foreach (Service Service in Globals.Services)
{
// Add a row to the datagrid for each service
this.dgrdServices.Rows.Add();
// Update the current service status
Service.Status = Service.Query(Service.Server, Service.Name);
if (Service.Status == "running")
{
this.dgrdServices.Rows[x].Cells[0].Value = Properties.Resources.green_dot;
this.dgrdServices.Rows[x].Cells[4].Value = Properties.Resources.stop_enabled;
}
else
{
this.dgrdServices.Rows[x].Cells[0].Value = Properties.Resources.grey_dot;
this.dgrdServices.Rows[x].Cells[4].Value = Properties.Resources.start_enabled;
}
this.dgrdServices.Rows[x].Cells[1].Value = Service.Server.ToUpper();
this.dgrdServices.Rows[x].Cells[2].Value = Service.FreindlyName;
this.dgrdServices.Rows[x].Cells[3].Value = Service.Status;
this.dgrdServices.Rows[x].Cells[5].Value = "Uninstall";
this.dgrdServices.Rows[x].Cells[6].Value = Service.Name;
x++;
}
}
PopulateServicesDataGrid() kodunu içeren servis durumu için bazı nesneler ve sorguları birkaç farklı sunucular arasında dolaşır.
Yukarıdakileri denediğimde ve çalıştırdığımda, ızgara dolu değil. Bir arka plan çalışanı kullanmıyor ve sadece PopulateServicesDataGrid'i doğrudan çağırıyorsam (her ne kadar uygulama kilitleniyorsa) çalışır.
Arka plan worker/datagrid neden çalışmıyor?
E parametresindeki RunWorkerCompleted olayındaki hataları kontrol etmeniz gerekir. Olayları kancalamadan önce RunWorkerAsync() koşmak sadece garip görünüyor. PopulateServicesDataGrid öğenizi yayınlamamak size yardımcı olmamıza yardımcı oluyor. – LarsTech
Arka plan çalışan ayrı bir işlemdir ve ızgarada görüntülenmez. Sunucunun sorguları, backgroundworker'ın bir DataTable döndürdüğü arka plan çalışanında olmalıdır. Ardından DataGrid'i döndürülen DataTable'ı kullanarak doldurun. – jdweng
PopulateServiceDataGrid yayınlandı. – Brad