异步等待不等待

时间:2016-03-20 15:19:20

标签: wpf async-await messagebox

试图找到类似的东西并阅读所有给出的答案,但找不到能解释给我的东西。

以下是打开对话框弹出窗口(WPF)的示例代码。我希望在ShowOverlayView变为True后,UI将可访问(这就是为什么async-await)和程序要等到用户点击"关闭"。

小澄清: ShowOverlayViewModel为ContentControl的Visibility属性设置布尔值为true / false。既然如此,那么我就没有什么值得等待的了#34;常规方式"。

目前,当视图正在显示时#34; 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;

    }

感谢您的帮助

1 个答案:

答案 0 :(得分:5)

Classic async-void bug。研究async void的作用以及为什么这是不好的做法。由于ShowOptionsDialog()未返回等待执行的任务,因此立即继续执行。将返回类型更改为Task并等待方法调用的结果。

您可以使用TaskCompletionSource<object>替换该活动并说出await myTcs.Task。 TCS是一个更适合TPL的活动。