0

処理が必要なアイテムのリストボックスがあり、それらを別のスレッドで非同期に処理したいと考えています。(これまでにこれを行ったことはありません)。

そこで、リストボックスの項目を処理するメソッドを呼び出すデリゲート (コールバック) を作成しました。

例外 "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
4

1 に答える 1

2

C# では、GUI を作成しなかったスレッドから GUI にアクセスする場合は、「Invoke required」
を使用します。VB.NET でも同じであると想定しています。
これを試してください: http://www.vbdotnetforums.com/database-general-discussion/19740-how-use-invokerequired.html

于 2012-06-22T17:30:54.253 に答える