перехват исключения, выданного ContentDialog :: ShowAsync в C ++ / WinRT

В 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 ()? И как я могу справиться с этим исключением?


person ssn    schedule 02.09.2020    source источник
comment
co_await show(); Исключение возникает из-за результата операции, который вы получаете, ожидая его.   -  person Raymond Chen    schedule 05.09.2020


Ответы (1)


Одновременно может отображаться только один 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();     
    ......
}
person Faywang - MSFT    schedule 03.09.2020
comment
Я хочу, чтобы первый вызов show отображал диалоговое окно, но хочу отобразить ошибку для отображения второго вызова. могу ли я сделать это и будет ли это работать: IAsyncAction MainPage :: CallerFunction () {попробуйте {co_await Show (); } catch (winrt :: hresult_error err) {дескриптор ..... возврат; }} то каким-то образом происходит два вызова CallerFunction (), и я хочу поймать исключение при втором вызове. - person ssn; 03.09.2020
comment
Когда я дважды вызвал метод CallerFunction (), он мог поймать исключение при втором вызове. Если вы используете метод try-catch, сможете ли вы успешно перехватить исключение? - person Faywang - MSFT; 04.09.2020