我有一个设想。(Windows Forms, c#, .NET)
UserControl_Load
方法,则UI在load方法执行期间变得无响应。伪代码看起来像这样:
代码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
}
}
但是我似乎还是回到了原点。再次申请
变得反应迟钝。这似乎是由于第1行if条件的执行。加载任务再次由父线程完成,而不是由我生成的第三个线程完成
我不知道我认为这是对还是错。我不熟悉穿线。
我如何解决这个问题,以及执行第1行if块的效果是什么?
情况是这样的:我想根据控件的值将数据加载到全局变量中。我不想改变子线程中控件的值。我不会从子线程中做。
因此只有访问值,才能从数据库中获取相应的数据。