【问题标题】:Working Asynchronously with GUI Controls in VB.NET在 VB.NET 中与 GUI 控件异步工作
【发布时间】:2012-06-22 17:24:27
【问题描述】:

我有一个需要处理的项目列表框,我想在单独的线程上异步处理它们。 (以前从未这样做过)。

所以我创建了一个委托,一个回调,称为对列表框项目执行工作的方法。

我收到一个异常“System.InvalidOperationException”: 跨线程操作无效:控件“ListBoxBlah”从创建它的线程以外的线程访问。

对单个项目执行异步操作对我来说没有意义,因为我这样做只是为了在后台执行大量操作(列表框可能有 20000 个项目),同时允许用户执行其他操作.

要与 GUI 交互,这必须变得更加复杂......我只是不知道如何:

Public Sub F(ByVal ext As String)
    If ListBoxBlah.SelectedIndex = -1 Then Return
    'Process ListBoxBlah
End Sub

Delegate Sub E(ByVal ext As String)

Sub Callback(ByVal ar As IAsyncResult)
    Dim t As E = CType(CType(ar, System.Runtime.Remoting.Messaging.AsyncResult).AsyncDelegate, E)
    t.EndInvoke(ar)
End Sub

Public Sub Ex()
    Dim t As E = AddressOf F
    t.BeginInvoke("ext", AddressOf Callback, "state")
End Sub

【问题讨论】:

  • 您能否更具体地说明您所说的“已处理”是什么意思?用户是否从列表框中添加和删除项目?在“处理”过程中是否应该允许他们这样做? “处理”是否需要了解列表框数据的更改,还是只需要处理数据的快照?
  • 当您说您有一个项目列表框时,我假设您想获取该列表(例如产品编号列表)并在后台执行某些操作是吗?如果是这样,请查看 BackgroundWorker 进程。最适合想要做异步工作的初学者bit.ly/320a66
  • 他们需要使用所选项目,无需添加或删除 - 但他们需要完全访问所选项目(如文件路径)(并且该列表倾向于刷新或使用不是我的线程)
  • 感觉有几个关键点还不清楚: 1)ListBox中的数据是从哪里来的? 2) ListBox 何时更新以及如何更新? 3)什么时候需要“处理”? 4)在“处理”发生时可以(或应该)更新(或可更新)列表框吗? 5)ListBox内容在“处理”过程中发生变化,是否需要通知“处理”?

标签: c# vb.net asynchronous delegates callback


【解决方案1】:

在 C# 中,当您想从未创建 GUI 的线程访问 GUI 时,您使用“需要调用”
我假设在 VB.NET 中是一样的。
试试这个:http://www.vbdotnetforums.com/database-general-discussion/19740-how-use-invokerequired.html

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多