bra*_*her 7 wpf user-interface multithreading event-handling
WPF中的UI更新存在问题.
我有这样的代码:
private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
{
Label.Visibility = Visibility.Visible;
TextBox.Text = "Processing...";
LongTimeMethod(); //some long operation
}
Run Code Online (Sandbox Code Playgroud)
问题是,在LongTimeMethod结束(即事件处理程序结束)之前,不会更改Label.Visibility和TextBox.Text.
到目前为止我解决了这个问题:
private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
{
Label.Visibility = Visibility.Visible;
TextBox.Text = "Processing...";
Dispatcher.BeginInvoke(new Action(LongTimeMethod),
DispatcherPriority.Background);
}
Run Code Online (Sandbox Code Playgroud)
没有使用调度程序调用还有其他解决方案吗?调用this.UpdateLayout()没有帮助.
随着Dispatcher.BeginInvoke你还在使用UI线程LongTimeMethod()。如果这不是必需的(即它正在执行某种后台处理),我建议使用 TPL 在后台线程上运行它:
private void ButtonClick_EventHandler(object sender, RoutedEventArgs e)
{
Label.Visibility = Visibility.Visible;
TextBox.Text = "Processing...";
Task.Factory.StartNew(() => LongTimeMethod())
.ContinueWith(t =>
{
Dispatcher.BeginInvoke((Action)delegate()
{
TextBox.Text = "Done!";
});
});
}
Run Code Online (Sandbox Code Playgroud)
使用此方法,长时间运行的方法在后台线程上处理(因此 UI 线程将可以自由地继续呈现并且应用程序不会冻结)并且您可以执行任何更改 UI 的操作(例如更新文本框文本)在Dispatcher后台任务完成时显示在 UI 上
| 归档时间: |
|
| 查看次数: |
4196 次 |
| 最近记录: |