ive搜索了高和低的搜索,以提高堆栈溢出所需的相关帖子。它帮助我学到了很多东西..但是我有几个问题..不仅与所需的调用有关,而且还有背景工人..请携带我..:)
我的应用程序需要很长的时间,并且需要在此过程中更新GUI(进度栏,状态栏,文本框)..我使用了一个线程,但是在更新UI时它给出了可怕的跨线程例外。(Kinda)毫无疑问地使用InvokeRequred。
public static partial class CHelper
{
public static void InvokeIfRequired(this Control oCtrl, MethodInvoker fnAction)
{
if (oCtrl.InvokeRequired)
{
oCtrl.Invoke(fnAction);
}
else
{
fnAction();
}
}
}
public partial class Form1 : Form
{
public void Test()
{
this.InvokeIfRequired(() =>
{
Text = "Window Title";
button1.Text = "Hello";
});
button1.InvokeIfRequired(() =>
{
Text = "Window Title";
button1.Text = "Hello";
});
}
}
现在是我注意到的。我期望Button1中的文本。InvokeifRequired将与Button1的文本属性相对应。但是,它是指父母表格的。对我来说,这似乎很愚蠢,不直觉和错误。P>
另一个问题..当时我没有掌握Invokerequiend的掌握
public partial class Form1 : Form
{
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
backgroundWorker1.ReportProgress(0, "Hello World");
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.UserState != null)
{
button1.Text = e.UserState as string;
}
}
}
到目前为止,这并没有引起我的问题。.我想知道这两种方法中的哪一种更好?为什么?另外,是否有一种方法可以将数据传递给PREPIFEREFREQUIRED函数?
谢谢.. =)
编辑01:使用对父表单或目标控件使用调用之间有任何区别吗?..是的表单。派遣和控制。它不是直观的,给人错误的印象。
好吧,对于按钮控件,这根本无关紧要。Windows有一个很难的规则,即窗口的所有子窗口必须由同一线程拥有。因此,按照该规则,表单和按钮的开始/Invoke()方法都将调用到正确的线程。
请注意,当您需要更新没有句柄属性的组件的属性时,它会变得尴尬。像工具键盘一样。现在您有选择另一个控件。因此,一致性并始终使用表格。
当然,请偏爱背景工作者。它有一个诀窍,可以通过限制射击脚的方式来帮助您正确解决此问题。