在下面的简化代码中,我希望文本框在获取结果时说“ 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线程上执行,并且可以访问控件。

09-11 19:16