C# “如何修复”;System.Reflection.targetingException:&x27;调用的目标已引发异常&引用;当使用Task.Run时
我不熟悉xamarin.forms,但当我尝试在xamarin.forms中使用Task.Run时,我遇到以下错误: System.Reflection.TargetInvocationException:'调用的目标已引发异常 到目前为止,我的代码是: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
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按钮事件吗