Вы правы. Книги - вещь полезная
Вот рабочий вариант:
[codebox]
private void Btn1_Click(object sender, System.EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.ReportProgress(0,"Working...");
e.Result = ExecQuery(worker,e);
}
private DataTable ExecQuery(BackgroundWorker worker, DoWorkEventArgs e)
{
if (worker.CancellationPending)
{
e.Cancel = true;
return null;
}
else
{
DataTable dtQueryRes = new DataTable();
daQuery.Fill(dtQueryRes);
worker.ReportProgress(100, "Complete.");
return (dtQueryRes);
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message, " Error");
}
else if (e.Cancelled)
{
this.StatusDesc.Text = "Canceled";
}
else
{
//привязка данных к гриду и т.д.
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.StatusProgress.Value = e.ProgressPercentage;
this.StatusDesc.Text = e.UserState.ToString();
}
private void btnStop_Click(object sender, EventArgs e)
{
this.backgroundWorker1.CancelAsync();
this.StatusDesc.Text = "Canceled";
this.btnStop.Visible = false;
}[/codebox]