2

タスクを待機して task.Wait() を使用することの違いはわかりませんが、最初の MessageDialog.ShowAsync メソッドでは機能しますが、2 つ目の方法では機能しません (2 つの構文は他の非同期メソッドで機能します)。

誰かが私が興味を持っている理由を説明できれば!

// this don't work, no dialog is shown (and UI is block)
var dialog = new MessageDialog("fail");
var task = dialog.ShowAsync().AsTask();
task.Wait();

// this work
var dialog = new MessageDialog("success");
var task = dialog.ShowAsync().AsTask();
await task;

なぜこれをしたいのかと聞かれます.catchブロックでダイアログを表示し(エラーメッセージを表示するため)、catchブロックの後に続行する前にユーザーがダイアログを閉じるのを待つ必要があるためです(はい、できます'catch ブロックで await を使用しませんが、Task.Wait() を使用できます。他の非同期メソッドで正常に使用しました)。

4

2 に答える 2

2

ダイアログの表示 (およびその中のボタンのクリックへの応答) は、UI スレッドから行う必要があります。しかし、UI スレッドで呼び出す場合は、基本的に、そのスレッドが完了Wait()するまで、そのスレッドでは他に何も起こらないと言っているのです。Taskこれがダイアログを表示できない理由であり、アプリケーションがフリーズする理由でもあります。

そのため、UI スレッドはダイアログを待機していますが、ダイアログは UI スレッドを待機しており、これは従来のデッドロックです。Wait()C# 5 GUI アプリケーションでデッドロックが発生する最も一般的な原因は、UI スレッドでの使用だと思います。

于 2012-06-24T16:16:13.583 に答える
1

task.Wait() はタスクが完了するまでブロックしますが、await は処理を続けます。私の推測では、UI がブロックされているため、メッセージ ダイアログが表示されません。

于 2012-06-24T15:50:06.473 に答える