2016-03-20 22 views
1

似たようなものを見つけようとしましたが、すべての答えを読みましたが、それを私に説明することはできませんでした。asyncは待たずに待っています

ここに、ダイアログポップアップ(WPF)を開くためのサンプルコードがあります。私は、ShowOverlayViewがTrueに変わった後、UIがアクセス可能になる(これがasync-awaitの理由です)と、ユーザーが "閉じる"をクリックしたときに終了するまで待つプログラムが必要です。

小さな説明: ShowOverlayViewModelは、ContentControlのVisibilityプロパティのブール値をtrue/falseに設定します。これが当てはまるので、私は「通常の方法」を待つことは何もありません。

現在、ビューが表示されているときに、MessageBoxがすぐに表示されます。 AutoResetEventを待っているようです。

小更新:これはMessageBox固有のものと思われます。私は、待っているコード行の後でMessageプロパティを変更しようとしましたが、それはare.Set()の後でのみ発生しました。私はまだそれがしたようにMessageBoxがなぜ動作したのか知りたいです。

private void CommandAction() 
    { 
     ShowOptionsDialog(); 
     MessageBox.Show(""); 
    } 

    private async void ShowOptionsDialog() 
    { 
     var are = new AutoResetEvent(false); 

     var viewmodel = new DialogPopupViewModel(); 
     viewmodel.Intialize("some title", "some message", DialogPopupViewModel.YesNoCancelButtons); 
     SetOverlayViewModel(viewmodel); 

     viewmodel.SetCloseViewAction(() => 
      { 
       HideOverlayView(); 
       are.Set(); 
      }); 
     ShowOverlayView = true; 

     await Task.Factory.StartNew(() => 
      { 
       are.WaitOne(); 
       //return viewmodel.DialogResult; 
      }); 
     //return DialogResultEnum.Cancel; 

    } 

ヘルプ

+0

#usr - これを行う方法については、より良い考えが大好きです。ありがとう –

答えて

4

クラシック非同期ボイドバグをありがとう。 async voidが何をし、なぜそれが悪い習慣であるかを研究します。 ShowOptionsDialog()は待って​​いるタスクを返さないので、実行はただちに続行されます。戻り値の型をTaskに変更し、メソッド呼び出しの結果を待ちます。

イベントをTaskCompletionSource<object>と置き換えて、await myTcs.Taskとすることができます。 TCSは、よりTPLに優しいイベントです。

+0

ありがとう。戻り値型のタスクは助けになりました。私はTaskCompletionSource についてお伝えします –

関連する問題