正在线程中加载数据

本文关键字:加载 数据 线程 | 更新日期: 2023-09-27 18:28:39

我的问题很简单,我的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语句可以优化,但这不是这个问题的意义所在,所以请不要建议这样做,。

正在线程中加载数据

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

  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

当然,手动处理线程逻辑也是可能的。在这种情况下,您可能需要研究BeginInvoke方法:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.begininvoke.aspx.

您需要在此处使用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();
}