以下のWPFコードにはボタンとラベルしかありません。私はこのような振る舞いを期待していました。私はボタンが無効になっているのを見て、 "Doing Stuff"がラベルに書かれていて、THEN UIがフリーズします。しかし、そうではありません。私は "Doing Stuff"ラベルのUIが最初まで凍結されているのを見ていません。この背後にある論理を教えてもらえますか?なぜThread.SleepはUIを即座にフリーズさせるのですか?Thread.Sleepの背後にあるロジック
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、非同期()=> {Task.Delay(4000)を待つ; <あなたの残りの部分コード>}); –
'Thread.Sleep(4000)'を 'await Task.Delay(TimeSpan.FromSeconds(4));'に置き換え、UIスレッドがブロックされないようにイベントハンドラ 'async'を作ります。 –