问题描述
在C ++ / CX中,我有:
IAsyncoperation<ContentDialogResult> Dialog::show() {
return dialog_.ShowAsync();
}
如果我创建并尝试显示两个对话框,结果show()被调用两次,则ShowAsync会引发异常:
任何时候都只能打开一个ContentDialog
我曾经捕获并处理过这种情况。根据我对转换规则的理解,当我将此代码转换为C ++ / WinRT时,应具有:
IAsyncoperation<ContentDialogResult> Dialog::show() {
co_return co_await dialog_.ShowAsync();
}
呼叫者看起来像这样:
void Dialog::caller(){
.....
try {
show();
} catch (winrt::hresult_error err) {
handle.....
return;
}
......
......
}
我确实看到了抛出Windows异常,但是不知何故我的代码没有捕获到它。
这是调用ShowAsync()的正确方法吗?我该如何处理该异常?
解决方法
一次只能显示一个ContentDialog。
当您直接调用show()两次时,第二个对话框将在显示第一个对话框后立即尝试显示。在显示之前,它不会等待第一个对话框关闭,因此会抛出此异常。
如果要一个一个显示两个对话框,则需要等待第一个对话框操作完成才能显示第二个对话框。例如:
对于C ++ / CX,您可以尝试使用task类来消耗异步操作。
IAsyncOperation<ContentDialogResult>^ ShowDialogSample::MainPage::Show()
{
return dialog->ShowAsync();
}
void MainPage::CallerFunction()
{
auto ShowTask = create_task(Show());
ShowTask.then([this](ContentDialogResult result)
{
......
Show();
});
}
对于C ++ / WinRT,您可以使用co_await语句来协同等待函数的结果,然后继续进行下一步。
IAsyncOperation<ContentDialogResult> MainPage::Show()
{
co_return co_await dialog.ShowAsync();
}
IAsyncAction MainPage::CallerFunction()
{
......
co_await Show();
co_await Show();
......
}