wpf - 异步等待不等待

标签 wpf async-await messagebox

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

这是打开对话框弹出窗口 (WPF) 的示例代码。我希望在 ShowOverlayView 变为 True 后,UI 将可以访问(这就是异步等待的原因)并且程序等待直到用户单击“关闭”时完成。

小说明: ShowOverlayViewModel 将 ContentControl 的 Visibility 属性的 bool 值设置为 true/false。既然如此,那我就没有什么可以等待“常规方式”了。

当前,当 View “可见”时,会立即显示 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;

    }

感谢帮助

最佳答案

经典的异步无效错误。研究 async void 的作用以及为什么它是不好的做法。自 ShowOptionsDialog()不返回等待执行的任务立即继续。将返回类型更改为 Task并等待方法调用的结果。

您可以将事件替换为 TaskCompletionSource<object>然后说 await myTcs.Task . TCS 是对 TPL 更友好的事件。

关于wpf - 异步等待不等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36115580/

相关文章:

WPF - 如何让某些 ListView 项目跨越列?

.net - 复制 app.config 进行部署

c# - 为什么 Silverlight TextBox 使用\r 而不是 Environment.Newline (\r\n) 作为换行符?

c# - WPF 4.5 中的 INotifyDataErrorInfo 和异步数据验证

mysql - 如何在带有异步和池的 Node 中使用 Mysql2 为 MySQL 获取 insertId?

javascript - 使用 MessageBox,更改为 'Yes' 或 'No'

c# - 为什么 (WPF) 窗口不是 0.0 像素宽?

javascript - 在失败之前轮询结果 n 次(尝试之间有延迟)

c# - 如何获取另一个进程MessageBox的消息?

c# - 让 Messagebox 显示一个变量