调用控件与调用表单
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
但你似乎也在询问是否调用窗体或控件。
xxxInvoke
到窗体还是特定控件都没有区别。两者都是 UI 元素,都可以为您编组调用。
如果您询问 Invoke
和 BeginInvoke
之间的区别,这两种方法可以通过消息泵编组对 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
.
进行繁琐的手动编组
例如我使用下面的代码:
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
但你似乎也在询问是否调用窗体或控件。
xxxInvoke
到窗体还是特定控件都没有区别。两者都是 UI 元素,都可以为您编组调用。如果您询问
Invoke
和BeginInvoke
之间的区别,这两种方法可以通过消息泵编组对 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
.