我有一个场景.(Windows Forms,C#,.NET)
UserControl_Load方法,则UI在加载方法执行的持续时间内变得无响应.伪代码看起来像这样:
代码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.
}
}
Run Code Online (Sandbox Code Playgroud)
它给出的例外是
跨线程操作无效:从创建它的线程以外的线程访问控件.
为了更多地了解这一点,我做了一些谷歌搜索,并提出了一个建议,如使用下面的代码
代码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 …Run Code Online (Sandbox Code Playgroud) 我最近开始在WPF编程并遇到了以下问题.我不明白如何使用该Dispatcher.Invoke()方法.我有线程经验,我做了一些简单的Windows窗体程序,我只是使用了它
Control.CheckForIllegalCrossThreadCalls = false;
Run Code Online (Sandbox Code Playgroud)
是的我知道这很蹩脚,但这些都是简单的监控应用程序.
事实是,现在我想提出一个WPF应用程序在后台检索数据,我开始了一个新的线程进行调用来检索(从网络服务器)的数据,现在我要显示它在我的WPF形式.问题是,我不能从这个线程设置任何控制.甚至没有标签或任何东西.怎么解决这个问题?
回答评论:
@Jalfp:
所以当我得到数据时,我在'new tread'中使用这个Dispatcher方法?或者我应该让后台工作程序检索数据,将其放入一个字段并启动一个等待该字段填满的新线程并调用调度程序将检索到的数据显示到控件中?
在WinForms应用程序中,将CheckForIllegalCrossThreadCalls设置为FALSE以避免调试期间的交叉线程错误是否安全?
CheckForIllegalCrossThreadCalls = false;
Run Code Online (Sandbox Code Playgroud)