如何调用组件
本文关键字:组件 调用 何调用 | 更新日期: 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;
}
}