2016-03-20 426 views
1

試圖找到類似的東西,並閱讀所有給出的答案,但無法找到將解釋給我的東西。異步等待不等待

下面是打開對話框彈出窗口(WPF)的示例代碼。在ShowOverlayView變爲True後,我希望UI可以被訪問(這就是異步等待的原因),並且程序要等到用戶單擊「Close」時完成。

小澄清: ShowOverlayViewModel爲ContentControl的Visibility屬性設置布爾值爲true/false。既然是這樣,那麼我就沒有什麼可以等待「常規方式」了。

當前視圖處於「可見」狀態時,立即顯示MessageBox。似乎它不會等待AutoResetEvent。

小更新:它似乎是特定於MessageBox。我嘗試在await代碼行之後更改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

經典異步void的錯誤。研究async void做什麼以及爲什麼這是不好的做法。由於ShowOptionsDialog()不會返回正在等待執行的任務,所以立即繼續執行。將返回類型更改爲Task並等待方法調用的結果。

您可以用TaskCompletionSource<object>代替事件,並說await myTcs.Task。 TCS是一個更友好的TPL事件。

+0

謝謝。返回類型任務幫助。我會閱讀有關TaskCompletionSource