我的问题很简单,我的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语句可以优化,但这不是这个问题的所在,所以请不要建议,。
答案 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)
你是如何进行多线程处理的?你手动创建线程吗?不要那样做。我建议采用以下三种方法之一:
async
/ await
- http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx(仅限.NET 4.5+)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。