Работа с Backgroundworker

  • Автор темы Balda
  • Дата начала
B

Balda

#1
MS VS .NET 2008.
Язык C#.
Чтобы процесс выполнения запроса к БД не грузил приложение пытаюсь запихать его во второй рабочий поток с помощью backgroundWorker.
Метод backgroundWorker_DoWork выглядит так:
Код:
dataSet1.Clear();
sqlDataAdapter1.Fill(dataSet1);
Но в результате датасет не заполняется... Почему?
 
E
#2
Ох ... читать и читать про треды/потоки и т.п.
DoWork это отдельный поток (буду тут его так обзывать), как видно вы не синхронизируете данные по потокам, отсюда и все вытекающее. вощем долго говорить лючше почитать.

Вам повезло что ваще не свалилось все, но это не долго ждать ;)
 
B

Balda

#3
Вы правы. Книги - вещь полезная :)
Вот рабочий вариант:
[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]