异步等待不等待
async await not waiting
试图找到类似的东西并阅读所有给出的答案,但找不到可以向我解释的东西。
这是打开对话框弹出窗口 (WPF) 的示例代码。我希望在 ShowOverlayView 变为 True 后,UI 将可以访问(这就是异步等待的原因)并且程序要等到用户单击 "Close".[=11 时完成=]
小说明:
ShowOverlayViewModel 将 ContentControl 的可见性 属性 的布尔值设置为 true/false。既然如此,那我也就等不及了"the regular way".
当前正在查看 "visible" MessageBox 会立即显示。
似乎它不等待 AutoResetEvent。
小更新: 似乎与 MessageBox 相关。我试图在等待代码行之后更改消息 属性,但它仅在 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()
没有 return 等待执行的任务会立即继续。将 return 类型更改为 Task
并等待方法调用的结果。
您可以用 TaskCompletionSource<object>
替换事件并说 await myTcs.Task
。 TCS 是对 TPL 更友好的赛事。
试图找到类似的东西并阅读所有给出的答案,但找不到可以向我解释的东西。
这是打开对话框弹出窗口 (WPF) 的示例代码。我希望在 ShowOverlayView 变为 True 后,UI 将可以访问(这就是异步等待的原因)并且程序要等到用户单击 "Close".[=11 时完成=]
小说明: ShowOverlayViewModel 将 ContentControl 的可见性 属性 的布尔值设置为 true/false。既然如此,那我也就等不及了"the regular way".
当前正在查看 "visible" MessageBox 会立即显示。 似乎它不等待 AutoResetEvent。
小更新: 似乎与 MessageBox 相关。我试图在等待代码行之后更改消息 属性,但它仅在 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()
没有 return 等待执行的任务会立即继续。将 return 类型更改为 Task
并等待方法调用的结果。
您可以用 TaskCompletionSource<object>
替换事件并说 await myTcs.Task
。 TCS 是对 TPL 更友好的赛事。