Работа с Backgroundworker

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

  1. Balda

    Balda Гость

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

    etc Гость

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

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

    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]
     
Загрузка...
Похожие Темы - Работа Backgroundworker
  1. Andrey Kha
    Ответов:
    0
    Просмотров:
    26
  2. Hoasker
    Ответов:
    0
    Просмотров:
    64
  3. garri671
    Ответов:
    0
    Просмотров:
    54
  4. lelik200969
    Ответов:
    0
    Просмотров:
    52
  5. Kozolick
    Ответов:
    0
    Просмотров:
    141

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