Xamarin формы: приложение UWP разрывается, когда выполнение кода доходит до строки displayalert - PullRequest
0 голосов
/ 21 декабря 2018

Я использую displayalert в своем проекте, и он отлично работает на устройствах android и ios.Но для части UWP она не работает на некоторых страницах.Когда выполнение кода доходит до строки displayalert, приложение UWP разрывается и перенаправляется на App.g.i.cs.Управление кодом сводится к следующему, если блок.

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
        UnhandledException += (sender, e) =>
        {
            if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
        };
#endif

Если навести курсор мыши на e, показывая {Windows.UI.Xaml.UnhandledExceptionEventArgs}

Я использую следующий код для отображения предупреждения:

await DisplayAlert("Alert", "A verification code has been sent to your email.", "OK");

Если я изменил вышеуказанные строки, как показано ниже, никаких проблем не возникнет.

Device.BeginInvokeOnMainThread(async () => 
{
    await DisplayAlert("Alert", "A verification code has been sent to your email.", "OK");
});

Есть ли какое-либо решение для этой проблемы без добавления Device.BeginInvokeOnMainThread?И в чем причина этой проблемы?

Пример кода : следующий код - это код, нажимаемый кнопкой.Когда выполнение кода доходит до какой-либо строки с предупреждением на дисплее, появляется сообщение об ошибке выше.

async void ButtonClicked(Object sender, EventArgs e)
        {
            UserDialogs.Instance.ShowLoading("Signing in...");
            var name = usernameEntry.Text;
            var password = passwordEntry.Text;

            if (Utility.IsInternet())
            {
                if (!string.IsNullOrWhiteSpace(name) && !string.IsNullOrWhiteSpace(password))
                {
                    UserLogin(name, password);
                }
                else
                {
                    UserDialogs.Instance.HideLoading();
                    await DisplayAlert("Alert", "Please enter all details", "Ok");
                }
            }
            else
            {
                UserDialogs.Instance.HideLoading();
                await DisplayAlert("Alert", "No internet connection", "Ok");
            }
        }

1 Ответ

0 голосов
/ 21 декабря 2018

В зависимости от того, где находится эта строка:

await DisplayAlert("Alert", "A verification code has been sent to your email.", "OK");

Вы можете сделать это без Device.BeginInvokeOnMainThread.Но я думаю, что важно знать, что сначала делает Device.BeginInvokeOnMainThread.

Всякий раз, когда вы выполняете что-то в потоке, отличном от основного, он запускается в фоновом режиме.Основной поток является единственным потоком, который может взаимодействовать с пользовательским интерфейсом просто потому, что в противном случае он станет путаницей с условиями гонки и непредсказуемым поведением пользовательского интерфейса.Насколько я знаю, это верно для каждого языка программирования.

Это означает, что любой код, окружающий ваше оповещение, выполняется в фоновом потоке.Вот почему вы получаете это исключение.Чтобы выполнить что-то в главном потоке (и, следовательно, иметь доступ к пользовательскому интерфейсу), вы можете заключить его в вызов Device.BeginInvokeOnMainThread.

Поскольку мы не знаем, как выглядит остальная часть вашего кода, онТрудно сказать, можете ли вы показать предупреждение без переноса в вызове Device.BeginInvokeOnMainThread.Но, надеюсь, с помощью этой информации вы сами сможете это понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...