Как исправить «System.Reflection.TargetInvocationException:« Исключение было сгенерировано целью вызова. »» При использовании Task.Run - PullRequest
0 голосов
/ 07 ноября 2019

Я новичок в xamarin.forms, но когда я попытался использовать Task.Run в xamarin.Forms, я получаю следующую ошибку:

System.Reflection.TargetInvocationException: 'Исключение было вызвано целью объектаinvocation

Мой код до сих пор:

 await Task.Run(async () =>
             {
                 await DoWork();
             });

Я пытался:

 await Task.Run(async () =>
             {
                 await DisplayAlert("hi","hi","hi");
             });

, но опять та же ошибка

1 Ответ

1 голос
/ 07 ноября 2019

При запуске

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
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...