调用控件与调用表单

Invoke on Control vs. Invoke on Form

例如我使用下面的代码:

private void startCalculcationButton_Click(object sender, EventArgs e) {
    int number;
    if (int.TryParse(this.numberTextBox.Text, out number)) {
    this.calculationResultLabel.Text = "(computing)";
        Task.Factory.StartNew(() => {
            int result = LongCalculation(number);
            this.calculationResultLabel.BeginInvoke(new ThreadStart(() => {
                this.calculationResultLabel.Text = result.ToString();
            }));
        });
    }
}

我调用 this.calculationResultLabel.BeginInvoke(...) 切换到 UI-线程以将结果设置为标签。

我也可以使用 this.Invoke(...)(这是表格)。它对内部有影响吗?

Invoke on Control vs. Invoke on Form

I could also use this.Invoke(...) (this is the Form). Does it make a difference internally?

听起来你在问两个不同的问题。你的标题说 Invoke 但你的代码 正在使用 BeginInvoke 但你似乎也在询问是否调用窗体或控件。

  1. xxxInvoke 到窗体还是特定控件都没有区别。两者都是 UI 元素,都可以为您编组调用。

  2. 如果您询问 InvokeBeginInvoke 之间的区别,这两种方法可以通过消息泵编组对 UI 线程的调用,它们之间是有区别的。 Invoke 会导致线程死锁,而后者不会。

无论如何,由于您正在使用 Task 并且您在 运行 长任务后立即更新 UI,可以说您做得更好:

private void startCalculcationButton_Click(object sender, EventArgs e) {
    int number;
    if (int.TryParse(this.numberTextBox.Text, out number)) 
    {
        this.calculationResultLabel.Text = "(computing)"; // UI thread
        var result  = await Task.Run(() => 
                LongCalculation(number));  // threadpool thread

        calculationResultLabel.Text = result.ToString(); // UI thread
    }
}

无需通过 BeginInvoke 或 dangerous-to-use Invoke.

进行繁琐的手动编组