在非常具体的场景中忽略 ViewModel 更改
ViewModel changes ignored in very specific scenario
我有一个绑定到按钮的方法,该方法非常耗时。所以我创建了一个标签并将其绑定到 属性 以通知用户应用程序实际上正在做某事。
private void Button_OnClick(object sender, RoutedEventArgs e)
{
_viewModel.BottomBarMessage = "Loading..."; //part 1
//do very long thing, for example
System.Threading.Thread.Sleep(3000); //wait for 3 seconds to simulate long operation
_viewModel.BottomBarMessage = "Done."; //part 2
}
问题是 part 1
似乎从未执行过。标签切换到 Done
但永远不会切换到 Loading
。
我怀疑是因为 UI 被阻止了,但是将 Sleep
更改为作为 Task
执行没有任何改变。
使用 await Task.Delay
而不是 Thread.Sleep
- 您正在阻塞 UI 线程。
类似于:
private async void Button_OnClick(object sender, RoutedEventArgs e)
{
_viewModel.BottomBarMessage = "Loading..."; //part 1
//do very long thing, for example
await Task.Delay(3000);
_viewModel.BottomBarMessage = "Done."; //part 2
}
我有一个绑定到按钮的方法,该方法非常耗时。所以我创建了一个标签并将其绑定到 属性 以通知用户应用程序实际上正在做某事。
private void Button_OnClick(object sender, RoutedEventArgs e)
{
_viewModel.BottomBarMessage = "Loading..."; //part 1
//do very long thing, for example
System.Threading.Thread.Sleep(3000); //wait for 3 seconds to simulate long operation
_viewModel.BottomBarMessage = "Done."; //part 2
}
问题是 part 1
似乎从未执行过。标签切换到 Done
但永远不会切换到 Loading
。
我怀疑是因为 UI 被阻止了,但是将 Sleep
更改为作为 Task
执行没有任何改变。
使用 await Task.Delay
而不是 Thread.Sleep
- 您正在阻塞 UI 线程。
类似于:
private async void Button_OnClick(object sender, RoutedEventArgs e)
{
_viewModel.BottomBarMessage = "Loading..."; //part 1
//do very long thing, for example
await Task.Delay(3000);
_viewModel.BottomBarMessage = "Done."; //part 2
}