-2

我的问题只是我的 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();
}

如果有更好的方法可以做到这一点,请告诉我,我所需要的只是应用程序不会冻结并将数据加载到组合编辑中。另外我知道可以优化 SQL 语句,但这不是这个问题的目的,所以请不要建议它。

4

2 回答 2

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

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

于 2013-08-22T09:33:57.530 回答
1

您需要在这里使用调度程序。这是因为您无法从另一个线程访问 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();
}
于 2013-08-22T09:31:05.523 回答