1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

Работа с Backgroundworker

Тема в разделе ".NET - программирование", создана пользователем Balda, 18 мар 2009.

  1. Balda

    Balda Гость

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

    etc Гость

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

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

    Balda Гость

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

Поделиться этой страницей