2014-01-16 4 views
1

У меня есть метод:backgroundWorker.ProgressChanged событие срабатывает слишком быстро

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    if (!backgroundWorker1.CancellationPending) 
    { 
     Ctransakcja obj = (Ctransakcja)e.UserState; 
     string[] row = new string[] { obj.id.ToString(), obj.tytul, obj.kwota, obj.nrkonta,obj.bank }; 
     dataGridView2.Rows.Add(row); 
    } 
} 

этот метод добавляет строки в DataGridView. в событии dowork фонового рабочего я вызываю метод LoadData, который подключается к базе данных и запускает событие ReportProgress.

LoadData:

... 
while (reader.Read()) 
{ 
    obj.id = int.Parse(reader[0].ToString()); 
    obj.tytul = reader[1].ToString(); 
    obj.kwota = reader[2].ToString(); 
    obj.nrkonta = reader[3].ToString(); 
    obj.bank = reader[4].ToString(); 
    //dodanie danych itd 
    backgroundWorker1.ReportProgress(i, obj); 
    i++; 
    // Thread.Sleep(100); 
} 
... 

Все работает с Thread.Sleep(100), но без даты сна в DataGridView смешиваются и воспроизводятся. Мне нужна функция WAIT, чтобы проверить, что строка добавлена, и вызвать следующий прогресс отчета в следующей строке из базы данных.

благодаря

+0

@CamBruce Потому что тогда вы не можете увидеть первый результат, пока последний результат не пришел, вместо того, чтобы быть в состоянии увидеть результаты поток, как они приходят в (и может быть оказано) – Servy

+0

@CamBruce я знаю, что это лучшее решение, но я думаю, как решить его в этой ситуации я получил :) –

+0

@Servy у вас есть идея решить мою проблему ???? –

ответ

0

ReportProgress событие действительно не должны быть использованы для связывания данных. Это больше для обновления контроля пользовательского интерфейса с прогрессом. Свяжите ваши данные в фоновом потоке, используя Invoke()

while (reader.Read()) 
{ 
    obj.id = int.Parse(reader[0].ToString()); 
    obj.tytul = reader[1].ToString(); 
    obj.kwota = reader[2].ToString(); 
    obj.nrkonta = reader[3].ToString(); 
    obj.bank = reader[4].ToString(); 
    //dodanie danych itd 


    dataGridView2.Invoke((MethodInvoker) delegate { dataGridView2.Rows.Add(obj);}); 

} 
+0

Нет смысла проверять 'InvokeRequired'. Вы знаете, что вы находитесь в фоновом потоке, поэтому вы знаете, что вам нужно вызвать. – Servy

+0

Правда. Старые привычки умирают, просто привыкли писать так. Будет обновлять сообщение. –

+0

Лично я еще не нашел один раз, в котором 'InvokeRequired' стоит использовать. Вы всегда должны знать, что данный блок кода должен быть запущен из потока пользовательского интерфейса или потока, отличного от UI. Полагая себя на том, что вы не знаете, будет ли какой-то код запущен из пользовательского интерфейса или потока, отличного от UI, это * ужасная позиция, в которой вы находитесь, и ее следует избегать при всех возможных затратах. – Servy

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