在下面的简化代码中,我希望文本框在获取结果时说“ Please wait ..”。但是它从未出现,而是textBox只显示functionThatTakesASecondOrTwoToRun()
的结果
xaml ...
<Button Name="readDutButton" Content="Read DUT" Click="readDutButton_Click"/>
<TextBox Name="resultTextBox"/>
背后的代码...。
private void readDutButton_Click(object sender, RoutedEventArgs e)
{
resultTextBox.Text = "Please wait..."; # this never appears
result = functionThatTakesASecondOrTwoToRun();
resultTextBox.Text = result;
}
最佳答案
工作需要在后台线程中进行,例如
resultTextBox.Text = "Please wait..."; // this never appears
Task.Factory.StartNew(() => functionThatTakesASecondOrTwoToRun())
.ContinueWith((t) => resultTextBox.Text = t.Result,
TaskScheduler.FromCurrentSynchronizationContext());
由于用户界面阻止了该线程,因此用户界面未更改要更新。 TaskScheduler.FromCurrentSynchronizationContext(),因此ContinueWith在UI线程上执行,并且可以访问控件。