还不需要另一个调用( 背景工人)



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()方法都将调用到正确的线程。

请注意,当您需要更新没有句柄属性的组件的属性时,它会变得尴尬。像工具键盘一样。现在您选择另一个控件。因此,一致性并始终使用表格。

当然,请偏爱背景工作者。它有一个诀窍,可以通过限制射击脚的方式来帮助您正确解决此问题。

最新更新