1. 有一个主窗体,其中包含一些用户控件。 2. 用户控件执行一些繁重的数据操作,如果直接调用“UserControl_Load”方法,则UI在加载方法执行期间会变得无响应。 3. 为了克服这个问题,我在不改变现有代码的情况下在不同的线程上加载数据。 4. 我使用了一个后台工作线程来加载数据,并在完成时通知应用程序它已经完成了它的工作。 5. 现在出现了一个真正的问题。所有的UI(主窗体及其子用户控件)都是在主线程上创建的。在用户控件的LOAD方法中,我根据用户控件上某些控件(如文本框)的值获取数据。
伪代码如下: CODE 1
UserContrl1_LoadDataMethod()
{
if (textbox1.text == "MyName") // This gives exception
{
//Load data corresponding to "MyName".
//Populate a globale variable List<string> which will be binded to grid at some later stage.
}
}
异常信息如下:
跨线程操作无效: 访问控件时引用了一个不是创建控件的线程。
为了更好地了解该问题,我进行了一些谷歌搜索,并得出了使用以下代码的建议:
代码2:
UserContrl1_LoadDataMethod()
{
if (InvokeRequired) // Line #1
{
this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod));
return;
}
if (textbox1.text == "MyName") // Now it won't give an exception
{
//Load data correspondin to "MyName"
//Populate a globale variable List<string> which will be binded to grid at some later stage
}
}
但是似乎我又回到了原点。应用程序再次变得无响应。这似乎是由于执行第一行if条件语句所致。加载任务再次由父线程而不是我创建的第三个线程完成。
我不知道我是否理解正确。
我该如何解决这个问题,执行第一行if块的效果是什么?
情况是这样的:我想根据控件的值将数据加载到全局变量中。我不想从子线程更改控件的值。我永远不会从子线程做这件事。
因此,只访问该值以便从数据库中获取相应的数据。