【发布时间】:2017-12-01 12:39:57
【问题描述】:
在下面的 WPF 代码中,只有一个按钮和一个标签。我希望行为是这样的:我会看到按钮被禁用,并且标签上写着“Doing Stuff”,然后 UI 将被冻结。但这种情况并非如此。我什至没有看到“Doing Stuff”标签 UI 一直冻结到开始。你能告诉我这背后的逻辑吗?为什么 Thread.Sleep 会让 UI 立即冻结?
using System.Threading.Tasks;
using System.Threading;
using System.Windows;
namespace MessagePump
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnDoStuff_Click(object sender, RoutedEventArgs e)
{
btnDoStuff.IsEnabled = false;
lblStatus.Content = "Doing Stuff";
Thread.Sleep(4000);
lblStatus.Content = "Not doing anything";
btnDoStuff.IsEnabled = true;
}
}
}
;
【问题讨论】:
-
您应该使用调度程序:this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { await Task.Delay(4000);
}); -
将
Thread.Sleep(4000)替换为await Task.Delay(TimeSpan.FromSeconds(4));,并设置事件处理程序async以避免UI线程被阻塞。