Как ПРАВИЛЬНО реализовать многопоточный индикатор выполнения во время запроса LINQ? - PullRequest
2 голосов
/ 31 октября 2011

Хорошо, так вот в чем дело:

У меня есть запрос linq, который загружает ок. 1000 строк в переменную, во время этого процесса я хочу отобразить индикатор выполнения, не обязательно указывающий процент, может быть в стиле выделения, не имеет значения.

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

Теперь вот мой код:

Private Sub LoadBar()
  Try
     Dim load As New frmLoadbar
     load.Text = "Loading bunch of data..."
     load.ShowDialog()
  Catch e As Threading.ThreadAbortException
     Threading.Thread.ResetAbort()
  End Try
End Sub

В другом подпункте:

Dim myThreadDelegate As New Threading.ThreadStart(AddressOf LoadBar)
Dim th As New Threading.Thread(myThreadDelegate)
th.Name = "TimeConsuming"
th.Start()
Dim XY = db.Table.GetEnumerator
While XY.MoveNext
    Dim item As New ListViewItem
    item.Text = XY.Current.Name
    item.Tag = XY.Current
    ListBox1.Items.Add(item)
End While
Autos.Dispose()
Try
    th.Abort()
Catch ex As Exception //here's where i 'swallow the re-thrown exception
End Try

Не это один из самых уродливых кодов, которые я когда-либо писал. Это работает, я просто не хочу этого переброшенного исключения.
Некоторое объяснение:

  • Я хочу закрыть модальную форму после выполнения запроса.
  • По этой причине я 'прерываю' поток, выполняющий форму.
  • Поскольку прерывание потока приводит к двойному исключению, мне нужно «проглотить» это исключение.

Теперь я знаю, что могу реализовать это следующим образом:

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

Но вот мой вопрос:

Какой лучший способ реализовать это?

  1. Я знаю, что это можно сделать с помощью фонового работника, который был специально придуманный по этой причине, но могу ли я использовать фон рабочий как нить показывать прогрессбар?
  2. Если нет (и мне нужно выполнить запрос в фоновом режиме и показывая модальную форму из моей первоначальной формы), это будет означать, что запрос будет "работать в фоновом режиме"?
  3. Значит ли это, что запрос будет медленнее?

Я изучал другие учебные пособия, но по тем или иным причинам, либо я не смог скопировать его (из-за сложности), либо я не был уверен, что он лучше этого.

Спасибо, что уделили время на ответ.

Ответы [ 3 ]

1 голос
/ 31 октября 2011

Хорошо, так что для дальнейшего использования, если кому-то понадобится чёткая помощь с примерами кода, у Microsoft есть её (это первое ..)

Вы можете скачать её здесь:

Многопоточность

1 голос
/ 31 октября 2011

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

0 голосов
/ 31 октября 2011

Предполагая, что Windows Forms, вы делаете это с компонентом BackgroundWorker .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...