【问题标题】:Access windows control from Backgroundworker DoWork从 Backgroundworker DoWork 访问窗口控制
【发布时间】:2010-08-11 22:01:13
【问题描述】:

我的问题如下:

我有一个窗口窗体,其中放置了一个 LayoutPanel,当窗体加载时,多个控件,例如:文本框和标签被添加到 LayoutPanel。

然后单击按钮,我需要处理用户在那些动态创建的控件上输入的数据。为此,我使用了一个 Backgroundworker,它应该可以获取这些控件并读取它们的数据。

我的问题是 Backgroundworker 不允许我从 DoWork 方法访问控件,但我需要这样做,因为我将报告操作的进度。

以下是我的代码部分以阐明概念:

private void frmMyForm_Load(object sender, EventArgs e)
    {
       //I add multiple controls, this one is just for example
       LayoutPanel1.add(TextBox1);

       ....
    }

private void bgwBackground_DoWork(object sender, DoWorkEventArgs e)
    {

       foreach (Control controlOut in LayoutPanel1.Controls)
       {
           //do some stuff, this one is just for example
           string myString = controlOut.Name; //-> Here is the error, cant access controls from different Thread.
       }
    }

设置文本很简单,只使用一个委托,但是让整个父控件来操作子控件怎么样(只是为了获取信息,我不想设置任何数据,只需要获取名称,文本,东西像那样)。

希望我说清楚了,谢谢大家。

【问题讨论】:

    标签: winforms backgroundworker


    【解决方案1】:

    您只能从 GUI 线程访问 Windows 窗体控件。如果您想从另一个线程操作它们,您将需要使用Control.Invoke 方法传入一个委托以在 GUI 线程上执行。在您的情况下,您应该可以这样做:

    private void bgwBackground_DoWork(object sender, DoWorkEventArgs e)
    {
        foreach (Control controlOut in LayoutPanel1.Controls)
        {
            this.Invoke(new MethodInvoker(delegate {
                // Execute the following code on the GUI thread.
                string myString = controlOut.Name;
            }));
        }
    }
    

    我喜欢定义一个允许我使用更简洁的 lambda 语法的扩展方法:

    // Extension method.
    internal static void Invoke(this Control control, Action action) {
        control.Invoke(action);
    }
    
    // Code elsewhere.
    this.Invoke(() => {
        string myString = controlOut.Name;
    });
    

    【讨论】:

      【解决方案2】:

      如您所知,从除 UI 线程之外的任何线程访问控制值是一个很大的禁忌。我想说一个合理的实现是使用 .NET 同步机制,例如 WaitHandle,在 UI 线程更新您选择的线程安全数据结构时暂停您的后台线程。

      这个想法是您的后台线程通知 UI 线程(通过您已经熟悉的委托机制)它需要信息,然后等待。当 UI 完成使用信息填充共享变量时,它会重置 WaitHandle,后台工作程序会恢复。

      在不写出和测试所有代码的情况下,让我给你一些资源:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-29
        • 1970-01-01
        • 2018-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        相关资源
        最近更新 更多