2017-03-07 8 views
0

を更新していません。 「開始」メッセージの表示が完全にスキップされます。ラベルは、私は次のコードを持っている

アプリケーションが起動しているときにラベルが「開始」に設定されていないのはなぜですか?複数のスレッドを使用せずに最初に「開始」に更新するにはどうすればよいですか?

途中でexecuteLongTask()メソッドがPowerShellスクリプトを呼び出し、label1.content = "Done"に進む前に出力を待っています。

答えて

3

何らかの理由で、executeLongTask()メソッドの完了後にラベルが「完了」に更新されるだけです。 「開始」メッセージの表示が完全にスキップされます。

WM_PAINTのアップデートを処理するには、UIスレッドをメインループに戻す必要があるからです。最初にラベルを設定すると、WPFはメッセージ処理ループに戻るときにラベルを再描画する必要があることに注意します。その後、UIはexecuteLongTaskメソッドでビジー状態に保たれ、2回目にラベルが設定され、WPFは再びラベルを再描画する必要があることに注意します。コントロールをUIメッセージループに戻すと、実際には実際にはチャンスが得られますあなたが画面に表示された内容を更新して更新します。

複数のスレッドを使用せずに最初に「スタート」に更新するにはどうすればよいですか?

最も簡単な解決策は、複数のスレッドを使用する場合はです。例:また

label1.content = "Start"; 
bool a = await Task.Run(() => executeLongTask()); 
label1.content = "Done"; 

、あなたが非同期的に行動するexecuteLongTaskを書き換えることができ、その後、あなたが別のスレッドを必要としないが:

label1.content = "Start"; 
bool a = await executeLongTaskAsync(); 
label1.content = "Done"; 
+0

はあなたの詳細で有益なポストのためにありがとうございました。私は、WPFが更新されるラベルを書き留めて、それが実際のメソッドから戻ってきたときに実際にそれを設定することを認識しませんでした。だから私は最初のラベルを設定して長時間実行した後に最後のラベルを設定できない理由について混乱しました。もう一度ありがとう、私はあなたが提供した最初のソリューションに行くと思います。 – John

1

テキストは、関数が返された後にのみ更新されます。 executeLongTask()の実行中に更新したい場合は、async/awaitパターンを使用する必要があります。長いタスクが完了するまでコントロールを戻すことができます。

関連する問題