在新线程上运行Linq查询

时间:2012-10-24 21:22:04

标签: c# multithreading linq

按照MSDN指南创建新线程来更新UI控件后,我收到一个奇怪的错误。我在load方法中运行了相同的查询,它运行得很好,现在在新线程中运行我得到了正确的结果数,但是我得到的字段名称只是在我的comboBox中写了16次DataSet。任何人都可以帮我这个吗?

private void Form1_Load(object sender, EventArgs e)
    {
        recipeListComboBox.Items.Clear();
        Thread QueryThread = new Thread(new ThreadStart(updateRecipeList));
        QueryThread.Start();
    }

 private void updateRecipeList()
    {

        IEnumerable<string> list = recipeList.getList();

        foreach (string a in list)
            UpdateRecipeComboBox(a);
    }

 private void UpdateRecipeComboBox(string text)
    {
        if (this.recipeListComboBox.InvokeRequired)
        {
            UpdateRecipeComboBoxCallBack d = new UpdateRecipeComboBoxCallBack(UpdateRecipeComboBox);
            Invoke(d, new object[] { text });
        }

        else
        {
            this.recipeListComboBox.Items.Add(Text);
        }
    }

    delegate void UpdateRecipeComboBoxCallBack(string text);

在我将它放在一个新线程之前,它看起来像这样:

private void Form1_Load(object sender, EventArgs e)
{
     recipeListComboBox.Items.Clear();
     IEnumerable<string> list = recipeList.getList();

     foreach (string a in list)
          recipeComboBox.Items.Add(a);

这会在数据库中重新显示16个不同收件人的列表,现在我只是将dataSet打印了16次。

感谢您的帮助!!

克雷格

1 个答案:

答案 0 :(得分:3)

如果您再次打印"DataSet",我猜你正在使用DataSet对象代替字符串参数并且它自动调用object.ToString()它返回类的名称。

不确定这是否是你的问题,但你也有套管不匹配:

private void UpdateRecipeComboBox(string text)
{
    if (this.recipeListComboBox.InvokeRequired)
    {
        UpdateRecipeComboBoxCallBack d = new UpdateRecipeComboBoxCallBack(UpdateRecipeComboBox);
        Invoke(d, new object[] { text });
    }

    else
    {
        this.recipeListComboBox.Items.Add(Text);  // <--- should be text???
    }
}