0

私は C# を学んでいて、スレッドの概念を練習し始めたところです。リストボックスを更新して、メインスレッド以外の別のスレッドから実際にデータを表示することはできません。

private void DoThreadBtn_Click(object sender, EventArgs e)
{
    ListBoxS.DataSource = sl.dump();  //This update the ListBox.
    //t = new Thread(dumpList);    //This don't update the Listbox
    //t.Start();
}
TestForm.ListBoxTest.StringList sl = new ListBoxTest.StringList();
public void dumpList()
{
    ListBoxS.DataSource = sl.dump(); //Returns a List<string>()
}

ここで間違っているのはどれですか? そして、それを修正するには、どの部分を学ぶべきですか? スレッドかデリゲートかラムダか?

4

2 に答える 2

1

WinForms アプリケーション cal:

public void dumpList()
{
    if (this.InvokeRequired)
    {
       this.Invoke(new MethodInvoker(this.dumpList));
       return;
    }

    ListBoxS.DataSource = sl.dump(); //Returns a List<string>()
}

コントロールのハンドルが呼び出しスレッドとは異なるスレッドで作成された場合、プロパティ InvokeRequired = true (othervise false)

于 2013-04-26T11:59:50.490 に答える
0

VB では、このようにするのが好きです (概念は C# にもほぼ同じように引き継がれるはずです)。

別のスレッドから UI を更新する方法を次に示します。「Sub Method」が UI を更新し、DoMethod が別のスレッドから呼び出されるとします。私の場合、データ テンプレートを使用して観察可能なコレクションにバインドされたリストボックスを更新していたことに注意してください。私のコードでは、画面に変更を反映させるために listbox.items.refresh を呼び出す必要があります。私は WPF と VB (不機嫌そうな古い C++ Win32/MFC 男) に本当に慣れていないので、これはおそらくこれまでで最も恐ろしいコードです。

注 - 省略記号 (...) は可変パラメータ リストです。元の subs パラメータ リストと一致させるのが好きです。

Delegate Sub DelegateMethod(...)
Sub Method(...)

End Sub

Public Sub DoMethod(...)

    Dim DM As DelegateMethod = AddressOf Method
    Me.Dispatcher.Invoke(DM, ...)

End Sub
于 2014-11-06T18:39:17.223 に答える