При запуске
await Task.Run(async() =>
{
Device.BeginInvokeOnMainThread(async () =>
{
// Not blocking main thread since it is still asynchronously called!!!
await DisplayAlert("hi", $"", "hi");
});
});
Сообщение об ошибке гласит:
Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare ()
Вы не можете запустить DisplayAlert из потока, который не является основным потоком! Вот почему вы должны вызывать либо
await Task.Run(async() =>
{
Device.BeginInvokeOnMainThread(async () =>
{
await DisplayAlert("hi", $"", "hi"); // Now launched from main thread!!!
});
});
, либо просто
await DisplayAlert("hi", $"", "hi"); // launched anyway from main thread.
В более общем случае вы хотите избежать изменения интерфейса пользователя из потока, который не являетсяосновной, так что если в «вашем» асинхронном методе вы изменяете пользовательский интерфейс, вам придется сделать это из основного потока, вызвав
public async void DoWork()
{
await DoHeaviWorkAsync();
Device.BeginInvokeOnMainThread(() =>
{
// Make changes to UI
});
}