在线程中加载数据

时间:2013-08-22 09:26:50

标签: c# sql multithreading

我的问题很简单,我的SQL查询需要2分钟才能完成,而且当我尝试获取所有数据时,我的应用程序无法冻结。我尝试过多线程,但我一直遇到一个错误,我很确定你会认出来。我的代码就在那之下。

跨线程操作无效:控制'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语句可以优化,但这不是这个问题的所在,所以请不要建议,。

2 个答案:

答案 0 :(得分:1)

您需要在此处使用调度程序。这是因为您无法从另一个线程访问UI线程拥有的控件。请查看此链接here。我没有检查过这个编译错误,但是这应该可以为你做一些修改。

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();
}

答案 1 :(得分:1)

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

  1. async / await - http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx(仅限.NET 4.5+)
  2. 任务并行库 - http://msdn.microsoft.com/en-us/library/dd460717.aspx(仅限.NET 4.0+)
  3. BackgroundWorker - http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
  4. 手动处理线程逻辑当然也是可能的。在这种情况下,您可能希望查看BeginInvoke方法:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.begininvoke.aspx