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

In WinForms application cal:

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

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

If the control's Handle was created on a different thread than the calling thread, property 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 回答