C# “如何修复”;System.Reflection.targetingException:&x27;调用的目标已引发异常&引用;当使用Task.Run时

C# “如何修复”;System.Reflection.targetingException:&x27;调用的目标已引发异常&引用;当使用Task.Run时,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我不熟悉xamarin.forms,但当我尝试在xamarin.forms中使用Task.Run时,我遇到以下错误: System.Reflection.TargetInvocationException:'调用的目标已引发异常 到目前为止,我的代码是: await Task.Run(async () => { await DoWork(); }); 我试过: await Task.Run(asyn

我不熟悉xamarin.forms,但当我尝试在xamarin.forms中使用Task.Run时,我遇到以下错误:

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

到目前为止,我的代码是:

 await Task.Run(async () =>
             {
                 await DoWork();
             });
我试过:

 await Task.Run(async () =>
             {
                 await DisplayAlert("hi","hi","hi");
             });
但当您运行时,再次出现相同的错误

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
    });
}

您需要查看InnerException以确定根本原因OK,但是当我使用我的方法时,我需要使用Task.run创建。您可以分享方法中的内容吗?因为Task.Run本身不是问题。例如,您可以调用:await Task.Run(async()=>{await Task.Delay(1000);});这不会引发任何异常…因为我的UI正在阻止我调用Task.Run-in按钮,当我调用Task.Run-in按钮事件时,程序返回我上面的错误我应该调用Task.Run-in按钮事件吗