跨线程操作无效:从创建它的线程以外的线程访问控制
我有一个场景。(Windows Forms,C#,.NET)
有一个主要表单托管一些用户控件。
用户控件执行一些繁重的数据操作,这样如果我直接调用该UserControl_Load
方法,则UI在加载方法执行的持续时间内变得无响应。
为了克服这个问题,我在不同的线程上加载数据(尝试尽可能少地更改现有代码)
我使用了后台工作线程来加载数据,完成后会通知应用程序已经完成了它的工作。
现在来了一个真正的问题。所有UI(主窗体及其子用户控件)都是在主要主线程上创建的。在usercontrol的LOAD方法中,我基于userControl上的某些控件(如文本框)的值来获取数据。
伪代码看起来像这样:
代码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 wont give an exception
{
//Load data correspondin to "MyName"
//Populate a globale variable List<string> which will be binded to grid at some later stage
}
}
但是但是......似乎我又回到原点了。应用程序再次无响应。这似乎是由于条件#1执行。加载任务再次由父线程完成,而不是我生成的第三个。
我不知道我是否认为这是对还是错。我是线程新手。
如何解决这个问题以及阻止执行第1行的影响是什么?
情况是这样的:我想根据控件的值将数据加载到全局变量中。我不想从子线程更改控件的值。我不打算从子线程中做到这一点。
因此只访问该值,以便可以从数据库中获取相应的数据。
手掌心
POPMUISE
守着一只汪