与VB.NET中的GUI控件异步工作

时间:2012-06-22 17:24:28

标签: c# vb.net asynchronous delegates callback

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

所以我创建了一个Delegate,一个Callback,调用了对列表框项目进行工作的方法。

我收到异常“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

1 个答案:

答案 0 :(得分:2)

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