• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Работа с Backgroundworker

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

Balda

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

etc

Ох ... читать и читать про треды/потоки и т.п.
DoWork это отдельный поток (буду тут его так обзывать), как видно вы не синхронизируете данные по потокам, отсюда и все вытекающее. вощем долго говорить лючше почитать.

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

Balda

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!