C# 在线程中加载数据

C# 在线程中加载数据,c#,sql,multithreading,C#,Sql,Multithreading,我的问题很简单,我的SQL查询需要2分钟才能完成,我不能让我的应用程序在尝试获取所有数据时冻结。我尝试过多线程,但我一直遇到一个错误,我相信你会意识到的。我的密码在那下面 跨线程操作无效:从创建控件“labelEdit1”的线程以外的线程访问控件“labelEdit1” private void Form_Load(object sender, EventArgs e) { startup = new Thread(loadInThread); start

我的问题很简单,我的SQL查询需要2分钟才能完成,我不能让我的应用程序在尝试获取所有数据时冻结。我尝试过多线程,但我一直遇到一个错误,我相信你会意识到的。我的密码在那下面

跨线程操作无效:从创建控件“labelEdit1”的线程以外的线程访问控件“labelEdit1”

private void Form_Load(object sender, EventArgs e)
    {
        startup = new Thread(loadInThread);
        startup.Start();            
    }

private void loadInThread()
{
    //getsDataFromSQL() is the method that takes over 2 minutes to do
    //it returns a String Array if that is helpful
    comboEdit1.Properties.Items.AddRange(getsDataFromSQL());   
    startup.Abort();
}

如果有更好的方法,那么请让我知道,我所需要的是应用程序不冻结和数据加载到comboEdit。我也知道SQL语句可以优化,但这不是这个问题的重点,所以请不要建议这样做。

您需要在这里使用dispatcher。这是因为您无法从另一个线程访问UI线程拥有的控件。检查此链接。我还没有检查编译错误,但这应该可以做一些修改,当然

private void loadInThread()
{
    //getsDataFromSQL() is the method that takes over 2 minutes to do
    //it returns a String Array if that is helpful
    comboEdit1.Dispatcher.BeginInvoke((Action)(() =>
    {
        comboEdit1.Properties.Items.AddRange(getsDataFromSQL());   
    }));
    startup.Abort();
}

您是如何进行多线程处理的?您是否手动创建线程?不要那样做。我建议采用以下三种方法之一:

  • 异步
    /
    等待
    -(.NET 4.5+版)
  • 任务并行库-(仅限.NET 4.0+版本)
  • BackgroundWorker
    -

  • 当然,手动处理线程逻辑也是可能的。在这种情况下,您可能需要研究BeginInvoke方法:。

    您对跨线程异常做过任何研究吗?这个问题的第一个相关问题的标题是“跨线程操作无效:从创建它的线程以外的线程访问控件”…我做过研究,我知道有一个backgroundworker等等,但是我读到Backgound worker无论如何都会将进程转移到主线程,所以这不是一个解决方案。。。因此,我询问了一种可能的不同方法的建议。您应该阅读发布的链接,因为它们向您展示了如何在处理完成后避免此问题(通过将UI更新编组到UI线程,而不是尝试在工作线程上进行)。我现在收到一个错误,说comboEdit1没有Dispatcher方法。这可能是因为我使用的是DevXPress组合框吗?请尝试“Dispatcher.BeginInvoke”而不是“comboEdit1.Dispatcher.BeginInvoke”。仅供参考,.NET framework 3及更高版本中引入的Dispatcher位于System.Windows.Threading命名空间中,而不是System.Threading中。