繁体   English   中英

从其他线程更新不会更新列表框

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM