2016-03-20 429 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