如何调用组件

本文关键字:组件 调用 何调用 | 更新日期: 2023-09-27 18:13:40

在我的应用程序中,我使用backgroundWorker,在一些文本框中设置文本,我需要首先调用那个文本框。

首先使用:

            if (someTextBox.InvokeRequired)
            {
                someTextBox.Invoke((MethodInvoker)delegate
                {
                    someTextBox.Text = "some_text";
                });
            }
            else
            {
                    someTextBox.Text = "some_text";
            }

这个方法对我来说很好,但因为我有多个文本框,我写:

    private void invComp(TextBox txtBox, String str)
    {
        if (txtBox.InvokeRequired)
        {
            txtBox.Invoke((MethodInvoker)delegate
            {
                txtBox.Text = str;
            });
        }
        else
        {
            txtBox.Text = str;
        }
    }

这样调用比较好吗?(invComp (someTextBox some_text);或许我还有第三个,贝瑟?

我调用一些按钮到,我想写一些像这样的按钮到,如果这是可以的?

Tnx

如何调用组件

控件。invokerrequired.com受到货物崇拜的影响。您正在从工作线程更新控件,您知道需要调用。所以测试它是毫无意义的。除了一个原因之外,当为false时,一定存在根本性的错误。当用户关闭窗口时,忘记停止工作线程是一个传统的bug,这种情况比程序员喜欢的要频繁得多。这会导致各种混乱,你想知道它:

private void invComp(TextBox txtBox, String str) {
    if (!this.InvokeRequired) throw new InvalidOperationException("You forgot to stop the worker");
    this.BeginInvoke(new Action(() => txtBox.Text = str));
}

简短、活泼、安全、快速。良好的代码质量。注意,它使用表单的BeginInvoke()方法,它不依赖于正在创建的子控件。并且它使用BeginInvoke()而不是Invoke(),这对于不使工作线程陷入困境并避免死锁很重要。总是避免调用Invoke(),只有当你需要知道一个方法的返回值时才需要。


一个完全不同的观点是关注你使用BackgroundWorker。它已经封送了对UI线程的调用,只是这个方法有一个笨拙的名字。您可以获得ProgressChanged事件来执行任何代码,它不仅仅是显示进度。像这样编写事件处理程序:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
    ((Action)e.UserState).Invoke();
}
现在你可以让它在UI线程上执行任何代码:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
    var worker = (BackgroundWorker)sender;
    //...
    worker.ReportProgress(0, new Action(() => textBox1.Text = "hello"));
}

您可以稍微修改一下您的方法,使其成为通用的,以便您可以将其用于任何控件。

    private void invComp<T>(T control, String str) where T: Control
    {
        if (control.InvokeRequired)
        {
            control.Invoke((MethodInvoker)delegate
            {
                control.Text = str;
            });
        }
        else
        {
            control.Text = str;
        }
    }