线程准备好后,C#Combo值可见

时间:2010-02-25 14:20:39

标签: c# winforms multithreading

在我的应用程序中,我在backgrounworker线程中更新了一个树视图。在更新树视图时,组合框值不可见。更新树视图后,将显示值。

这是我的背景工作代码:

void _bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    tvCategories.Invoke((MethodInvoker)delegate()
    {
        FillCategoryTreeView(); // Fills the treeview
    }
    );
}

填充我的组合框的代码:

private void FillCategoryCombo()
{
    Category categorie = new Category();
    List<Category> categories = categorie.GetQuestionCategories();

    cmbCategories.DataSource = categories;
    cmbCategories.DisplayMember = "Description";
    cmbCategories.ValueMember = "Id";
}

组合框填充在表单的构造函数中。

我将树视图放在一个单独的线程中的原因是因为必须更新树视图。与此同时,我想继续使用该应用程序。因此我需要访问组合框。但是在更新树视图时,组合框的值是不可见的。

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我不太确定你的帖子中有足够的信息来完全回答这个问题...但是假设你在调用FillCategoryCombo()方法之前在构造函数中创建了后台工作线程......这很有意义

在你的后台工作者方法中,你立即调用Invoke,它将控制权切换回UI线程,然后在FillCategoryCombo()有机会运行之前,它将执行FillCategoryTreeView()的工作。

如果要异步填充树视图(假设它来自长时间运行的数据库调用),那么当您特别需要添加树视图项时,您需要做的是在FillCategoryTreeView中实际具有单独的Invoke调用。这样,当每个数据库调用(或任何花费很长时间)完成时,它只在需要添加物理树节点时在UI线程上执行操作。