【发布时间】:2015-02-20 22:19:12
【问题描述】:
这显然是我不了解如何正确设置 UI 线程的问题,但我不知道如何修复它。
我有一个 datagridview,我在其中单击一个按钮,从网络获取信息,然后将其与新数据一起显示在 datagridview 上。当它在网络上时,我有一个带有更新 gif 的表格,我称之为“加载”表格。在该表单中,我使用 Internet 上的典型 OnFrameChanged 和 m_isAnimating 代码更新了 gif。
但是,无论我使用什么格式,我总是在这里捕获到这个异常:
Public loader As New Loading
Private Sub OnFrameChanged(ByVal o As Object, ByVal e As EventArgs)
Try ' If animation is allowed call the ImageAnimator UpdateFrames method
' to show the next frame in the animation.
Me.Invalidate()
If m_IsAnimating Then
ImageAnimator.UpdateFrames()
Me.Refresh()
'Draw the next frame in the animation.
Dim aGraphics As Graphics = PictureBox1.CreateGraphics
aGraphics.DrawImage(_AnimatedGif, New Point(0, 0))
aGraphics.Dispose()
End If
Catch ex As InvalidOperationException
End Try
End Sub
它通常会说“是从不是在其上创建的线程访问的”或“无法访问已处置的对象。对象名称:'PictureBox'”。
但我不知道为什么会这样,因为我每次都在这里创建一个新实例。这是按钮的代码:
Private Sub btnSlowSearch_Click(sender As Object, e As EventArgs) Handles btnSlowSearch.Click
Me.Cursor = Cursors.WaitCursor
'get datatable
loader.Show()
BWorkerLoadProp.RunWorkerAsync() 'go get data on network
'bworker will update datagridview with new data
'wait for worker to finish
If BWorkerLoadProp.IsBusy Then
Threading.Thread.Sleep(1)
End If
loader.Close()
End Sub
我意识到这不是很好的代码,但我尝试将加载程序放在后台工作程序中,我尝试了任何方法。但无论异常被称为什么。
在我做后台工作时显示另一个更新表单的正确方法是什么?
【问题讨论】:
-
调用 loader.Close() 后,loader 对象不再可用。所以你第二次点击按钮时,你的程序总是会爆炸。摆脱
As New,您必须使用New 运算符显式创建一个新的Loading 实例。 -
所以“公共加载器 = 新加载”?
-
不,公共加载器作为加载。在您的 Click 事件处理程序中:loader = New Loading
-
抱歉,但是在单击事件中的“公共加载程序作为加载”和加载程序 = 新加载“的设置中仍然会引发异常。所以我的表单实际上从未显示在我的 gui 上
-
是否有可能在
btnSlowSearch_Click中调用关闭后调用您的OnFrameChanged?我不确定,但逻辑似乎建议在显示动画的表单的关闭事件中调用 ImageAnimator.StopAnimate。
标签: vb.net multithreading user-interface datagridview