使用Task.Run时如何修复“ System.Reflection.TargetInvocationException:调用的目标引发了异常。”

时间:2019-11-07 15:32:54

标签: c# xamarin xamarin.forms

我是xamarin.forms的新手,但是当我尝试在xamarin.Forms中使用Task.Run时,出现以下错误:

System.Reflection.TargetInvocationException:'调用的目标引发了异常

到目前为止我的代码:

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

我尝试过:

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

但还是相同的错误

1 个答案:

答案 0 :(得分:1)

跑步时

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.

在更一般的情况下,您要避免的是从不是主线程的线程中修改UI,因此,如果在“您的”异步方法中修改UI,则必须从线程中进行操作。通过调用主线程

public async void DoWork()
{
    await DoHeaviWorkAsync();

    Device.BeginInvokeOnMainThread(() =>
    {
        // Make changes to UI
    });
}