【问题标题】:async await not waiting异步等待不等待
【发布时间】:2016-07-07 01:11:06
【问题描述】:

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

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

    }

感谢您的帮助

【问题讨论】:

  • #usr - 我很想知道如何做到这一点。谢谢

标签: wpf async-await messagebox


【解决方案1】:

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

您可以将事件替换为 TaskCompletionSource<object> 并说 await myTcs.Task。 TCS 是更适合 TPL 的活动。

【讨论】:

  • 谢谢。返回类型 Task 有所帮助。我将阅读有关 TaskCompletionSource 的信息
猜你喜欢
  • 2016-03-25
  • 2017-10-09
  • 2017-12-11
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 2020-10-04
相关资源
最近更新 更多