2013-11-27 3 views
1

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

вот Initialize

backgroundworker1 = new System.ComponentModel.BackgroundWorker(); 
     backgroundworker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); 
     backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted); 

так первый, когда кнопка высчитывает щелкнул:

private void buttonCalculate_Click(object sender, EventArgs e) 
    { 
     //execute the background worker 
     this.backgroundworker1.RunWorkerAsync(); 
     while (this.backgroundworker1.IsBusy) 
     { 
      progressBar1.Visible=true; 
      Application.DoEvents(); 
     } 
    } 

Вот событие backgroundworker1_DoWork

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      connection = new MySqlConnection(prop.connectionString); 
      string query = "Call telephelyi_2013()"; 

       if (this.OpenConnection() == true) 
       { 

        MySqlCommand cmd = new MySqlCommand(); 
        cmd = connection.CreateCommand(); 
        cmd.CommandText = query; 
        cmd.ExecuteNonQuery(); 
       } 

     } 

и, наконец, когда операция comleeted это shuld сделайте это

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     progressBar1.Visible = false; 
     MessageBox.Show("Számítás befejzve!"); 
    } 

Но в конце концов, когда я запускаю программу и нажимаю кнопку «Расчет», индикатор выполнения отображается и только перемещение никогда не заканчивается. И я также вижу, что компьютер вычисляет какое-то время и после остановок, но я никогда не получаю это сообщение конца!

В чем проблема?

ответ

1

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

Просто ваш щелчок кнопки сделать это:

this.backgroundworker1.RunWorkerAsync(); 
progressBar1.Visible=true; 

И вуаля.

+0

его все еще никогда не ступайте в фоновый режимWorker1_RunWorkerУдаленная задача. Но я вижу, что программа делает то, что она должна. Как работает фон, знаете, что программа закончена или нет? – balage90

+0

@ balage90 Фоновый работник написан для запуска события, когда событие DoWork завершается. – Servy

Смежные вопросы