相关疑难解决方法(0)

跨线程操作无效:从创建它的线程以外的线程访问控件

我有一个场景.(Windows Forms,C#,.NET)

  1. 有一个主要表单托管一些用户控件.
  2. 用户控件执行一些繁重的数据操作,这样如果我直接调用了 UserControl_Load方法,则UI在加载方法执行的持续时间内变得无响应.
  3. 为了克服这个问题,我在不同的线程上加载数据(尝试尽可能少地更改现有代码)
  4. 我使用了后台工作线程来加载数据,完成后会通知应用程序已经完成了它的工作.
  5. 现在来了一个真正的问题.所有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.
    }
}
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)

c# multithreading invoke winforms

559
推荐指数
18
解决办法
39万
查看次数

使用Dispatcher.Invoke从非主线程更改WPF控件

我最近开始在WPF编程并遇到了以下问题.我不明白如何使用该Dispatcher.Invoke()方法.我有线程经验,我做了一些简单的Windows窗体程序,我只是使用了它

Control.CheckForIllegalCrossThreadCalls = false;
Run Code Online (Sandbox Code Playgroud)

是的我知道这很蹩脚,但这些都是简单的监控应用程序.

事实是,现在我想提出一个WPF应用程序在后台检索数据,我开始了一个新的线程进行调用来检索(从网络服务器)的数据,现在我要显示它在我的WPF形式.问题是,我不能从这个线程设置任何控制.甚至没有标签或任何东西.怎么解决这个问题?

回答评论:
@Jalfp:
所以当我得到数据时,我在'new tread'中使用这个Dispatcher方法?或者我应该让后台工作程序检索数据,将其放入一个字段并启动一个等待该字段填满的新线程并调用调度程序将检索到的数据显示到控件中?

c# wpf multithreading dispatcher

69
推荐指数
3
解决办法
20万
查看次数

20
推荐指数
1
解决办法
8364
查看次数

标签 统计

multithreading ×3

c# ×2

winforms ×2

.net ×1

dispatcher ×1

invoke ×1

wpf ×1