在C ++ / WinRT中捕获ContentDialog :: ShowAsync引发的异常

问题描述

在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();     
    ......
}