2012-06-22 15 views
0

我有一个需要处理的项目列表框,我想在一个单独的线程上异步处理它们。 (之前从未这样做过)。与VB.NET中的GUI控件异步工作

因此,我创建了一个委托,一个回调,调用列表框项目上的工作的方法。

我得到一个异常“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 
+0

你可以更具体地说明你的意思是“处理”吗?用户是否从列表框中添加和删除项目?是否应该在“处理”发生时允许这样做?是否需要让“处理”知道列表框数据的变化,还是只需要处理数据快照? –

+0

当你说你有一个项目列表框时,我假设你想要列表(例如产品编号列表),并在背景中做某些事情是的?如果这样看看BackgroundWorker进程。这是初学者想要做异步工作的最佳方式http://bit.ly/320a66 –

+0

他们需要使用选定的项目,不添加或删除 - 但他们需要完全访问选定的项目(如文件路径)(和该列表倾向于刷新或使用不属于我的线程的项目) – Thalia

回答