Замораживание GUI после того, как обновления данных были обновлены с использованием фоновых рабочих - PullRequest
0 голосов
/ 08 марта 2010

Я сделал приложение, которое запускает трех фоновых рабочих одновременно. Он в основном обновляет три вида данных, которые он делает на месте. Моя проблема в том, что если я нажимаю кнопку maximizebox или где-либо в любом из представлений данных, программа зависает довольно долго. Я могу использовать горизонтальную прокрутку, но не вертикальную прокрутку. Я пробовал Backgroundworker_runworkercompleted, и он запускается по мере необходимости после того, как потоки обновили свои соответствующие представления данных. Это нормальное поведение, или я делаю что-то не так, любые предложения будут полезны. П.С .: Я запустил всю программу, используя пошаговый метод, и в коде нет бесконечного цикла. заранее спасибо Jhon

Ответы [ 5 ]

2 голосов
/ 16 июля 2014

Поместите эту строку кода непосредственно перед вызовом Backgroundworker1.RunWorkerAsync(), чтобы временно отключить полосы прокрутки просмотра данных.

DataGridView1.ScrollBars = ScrollBars.None

Теперь снова включите полосы прокрутки в вашем сетке данных, добавив эту строку кода в BackgroundWorker1_RunWorkerCompleted событие.

DataGridView1.ScrollBars = ScrollBars.Both

Это никогда не сделает ваше приложение неподходящим.

0 голосов
/ 31 января 2017

У меня была такая же проблема. Когда мои dataGridViews обновлялись из потока пользовательского интерфейса, они работали нормально. Когда я попытался добавить к ним ряд строк из backgroundWorker, они перестали отвечать.

Чтобы исправить это, я добавил строки в таблицу данных. Когда я запускаю backgroundWorker, я устанавливаю свойство .datasource объекта dataGridView в ничто. Когда рабочий завершает работу, я снова возвращаю его в dataTable. Это вынуждает dataGridView обновлять себя и разрывает синхронную связь между тем, что происходит в рабочем потоке, и тем, что отображается в пользовательском интерфейсе, что, по-видимому, облегчает неотзывание после завершения рабочего.

Пример использования:

Private Sub button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click
    If bgWorker1.IsBusy <> True Then
        dataGridView1.DataSource = Nothing

        bgWorker1.RunWorkerAsync()
    End If
End Sub

Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bgWorker1.DoWork
    dataTable1.Rows.Add("data")
End Sub

Private Sub bgWorker_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As RunWorkerCompletedEventArgs) Handles bgWorker1.RunWorkerCompleted
    dataGridView1.DataSource = dataTable1
    dataGridView1.Refresh()
End Sub
0 голосов
/ 24 мая 2016

Вы должны убедиться, что обновляете представления данных из потока интерфейса.

0 голосов
/ 09 марта 2010

Хорошо, я нашел решение своей проблемы, работая над последовательным устранением обнаруженных проблемных точек, я вызвал свой datagridview вне события backgroundworker.dowork и вуаля, которая решила проблему. Мораль истории «НИКОГДА НЕ ОБНОВЛЯЙТЕ СМОТРЕТЬ ДАННЫЕ ИЗ ВНУТРЕННЕЙ РЕЗЬБЫ ФОНА», особенно если вы не знаете, что делаете неправильно :). Я надеюсь, что это поможет кому-то в будущем.

0 голосов
/ 08 марта 2010

Похоже, вы все еще как-то блокируете поток пользовательского интерфейса. Вам может быть полезно опубликовать некоторые фрагменты кода. Кроме того, какова загрузка ЦП вашего процесса? Если загрузка процессора высока, возможно, вы как-то истощаете поток пользовательского интерфейса.

...