[英]Updating from different thread didn't update Listbox
我正在学习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>()
}
这里哪错了? 要解决它,我应该学习哪一部分? 线程还是委托还是Lamda?
在WinForms应用程序中,校准:
public void dumpList()
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(this.dumpList));
return;
}
ListBoxS.DataSource = sl.dump(); //Returns a List<string>()
}
如果控件的Handle是在与调用线程不同的线程上创建的,则属性InvokeRequired = true(否则为false)
在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.