2

これがコードサンプルです。私が抱えている問題を再現するには、フォームにListBox呼び出しを配置する必要があります。list_of_items

Imports System.Threading.Tasks

Public Class Form1
  Dim _dt As DataTable

  Private Sub Form1_Load() Handles MyBase.Load
    _dt = New DataTable
    With _dt.Columns
      .Add("key")
      .Add("value")
    End With
    With list_of_items
      .ValueMember = "key"
      .DisplayMember = "value"
      .DataSource = _dt
    End With
    Dim addItemsTask As New Task(AddressOf AddThreeItems)
    addItemsTask.Start() 'does not add anything when done
    'AddThreeItems() #doing this instead works!
  End Sub

  Private Sub AddThreeItems()
    Threading.Thread.Sleep(2000)
    With _dt.Rows
      .Add({"1", "One"})
      .Add({"2", "Two"})
      .Add({"3", "Three"})
    End With
    Me.Invoke(Sub() Me.Text = "Separate thread is done")
  End Sub
End Class

問題は、行が物理的に追加されるため、DataTable.Rows.Count増加しますが、視覚的には何も起こりません。に電話してRefresh、リセットDataSourceNothingて元に戻そうとしましたが、役に立ちません。これをシングル スレッド処理に切り替えると、図に示した方法で行が問題なく追加されます。問題は何ですか?

4

2 に答える 2

1

いろいろ試してMe.Invokeみたところ、 を使用してダミー レコードを同期的に追加すると、Invoke以前に追加したすべてのレコードが実際に追加されることがわかりました。次に、このダミー レコードを .csv から削除するだけですDataTable。より良い解決策やより洗練された回避策がある場合、またはこのように機能する理由を説明できる場合は、お気軽に回答として投稿してください。コードは次のようになります。

Private Sub AddThreeItems()
  Threading.Thread.Sleep(2000)
  With _dt.Rows
    .Add({"1", "One"})
    .Add({"2", "Two"})
    .Add({"3", "Three"})
  End With
  Me.Invoke(Sub()
              _dt.Rows.Add()
              _dt.Rows.RemoveAt(_dt.Rows.Count - 1)
              Me.Text = "Separate thread is done"
            End Sub)
End Sub
于 2012-10-24T18:25:44.293 に答える
1

データ ソースの再割り当て

Me.Invoke(
    Sub()
        list_of_items.DataSource = Nothing 
        list_of_items.DataSource = _dt 
        Me.Text = "Separate thread is done"
    End Sub
) 
于 2012-10-24T18:06:33.157 に答える