相关疑难解决方法(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万
查看次数

解决WinForms中的跨线程异常

目前我正在使用WinForms(在C#中),我必须在后台运行该应用程序.为此我正在使用异步.当我运行应用程序时,它显示了一个例外

"跨线程操作无效:控制''从创建它的线程以外的线程访问."

我该如何解决这个错误?

c# multithreading winforms

8
推荐指数
1
解决办法
2万
查看次数

C#我可以使用backgroundwork线程将值添加到列表框中吗?

我希望我的后台工作者将项目添加到列表框中,它在调试时似乎这样做,但列表框不显示值.我怀疑这与在后台工作线程中添加项目有关,我是否需要将这些添加到数组中,然后在数组中填充列表框backgroundWorker1_RunWorkerCompleted

谢谢您的帮助.

c# backgroundworker

6
推荐指数
3
解决办法
2万
查看次数

跨线程操作无效:控件“ label1”是从创建该线程的线程之外的线程访问的

可能重复:
为什么我收到此错误:“跨线程操作无效:控制lbFolders从创建该线程的线程之外的其他线程访问。”?

我是winforms的新手,在我的代码中,我正在使用for循环更新进度条,现在我需要以循环计数的形式更新Label,如下所示-

公共部分类Form1:表单{public Form1(){InitializeComponent();

        Shown += new EventHandler(Form1_Shown);

        // To report progress from the background worker we need to set this property
        backgroundWorker1.WorkerReportsProgress = true;
        // This event will be raised on the worker thread when the worker starts
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        // This event will be raised when we call ReportProgress
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    void Form1_Shown(object sender, EventArgs e)
    {
        // Start the background worker
        backgroundWorker1.RunWorkerAsync();
    } …
Run Code Online (Sandbox Code Playgroud)

c# winforms progress-bar

2
推荐指数
2
解决办法
2万
查看次数