异步等待不等待

sha*_*dad 1 wpf messagebox async-await

试图找到类似的东西,阅读所有给出的答案,但无法找到一些可以解释给我的东西.

以下是打开对话框弹出窗口(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;

    }
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

usr*_*usr 5

经典的async-void错误.研究async void的作用以及为什么这是不好的做法.由于ShowOptionsDialog()不返回等待执行的任务立即继续执行.将返回类型更改为Task等待方法调用的结果.

你可以用a TaskCompletionSource<object>和say 来代替事件await myTcs.Task.TCS是一个更适合TPL的活动.