如何在LINQ查询期间正确实现多线程进度条?

时间:2011-10-31 15:24:36

标签: vb.net multithreading performance

好的,这就是事情:

我有一个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

这不是我写过的最丑陋的代码之一。它的作用我只是不想要那个重新抛出的例外。
一些解释:

  • 我想在查询完成后关闭模式表单。
  • 因此我“中止”运行表单的线程。
  • 由于中止线程抛出双重异常我必须'吞下' 那个例外。

现在我知道我可以像下面这样实现:

  • 将循环编码到包含进度条的表单中,然后进行检查 定期获取布尔值,如果形式为真,则可以 关闭自己。
  • 从另一种形式 - 在工作线程上 - 我可以改变它 查询完成后,booleans值为true。

但是我的问题出现了:

实现这个的最好方法是什么?

  1. 我知道可以通过后台工作人员来完成 专门为此发明,但我可以使用背景 worker作为显示进度条的线程?
  2. 如果不是(我必须在后台工作者上运行查询 显示我的原始形式的模态形式),这意味着 查询将“在后台工作”?
  3. 这是否意味着查询会更慢?
  4. 我已经查看了其他教程,但由于某种原因,要么我无法复制它(由于复杂性),要么我不相信它比这更好。

    感谢您抽出时间回答。

3 个答案:

答案 0 :(得分:1)

您可以显示模态表单,然后从该表单运行BackgroundWorker。进度和已完成的事件将在UI线程上,因此您可以在运行时更新进度条并在已完成的事件处理程序中关闭表单。

答案 1 :(得分:1)

好的,所以为了将来参考,如果有人需要明确的代码示例帮助,微软有它(这是第一个...)

您可以在此处下载:

Multithreading

答案 2 :(得分:0)

假设使用Windows窗体,您可以使用BackgroundWorker component

执行此操作