某些事情正在使我的正在运行的任务超出代码中的某一点(请参阅下面的位置)。它只是停止执行。它只发生在iOS设备上。在iOS模拟器和Android设备上,它运行完美。以前见过这样的人吗?我不认为它是死锁或种族条件,因为那样它在其他设备上无法成功完成吗?
这里有一些代码;
private async Task ExecuteFreshAndPopulateUI(IFetchVehicleCommand command)
{
List<Models.Vehicle.Vehicle> vehicles = await command.ReturnAndExecute<Models.Vehicle.Vehicle>();
var z = 9;
ListPopulateObservableCollection(vehicles, view.Vehicles);
}
public virtual async Task<dynamic> ReturnAndExecute<T>() where T : new()
{
await FlushCache<T>();
await Execute();
await CheckIfCached<T>();
return (dynamic) cachedResult.cachedObject;
}
public override async Task Execute()
{
try
{
dynamic x = await fetchableService.Fetch(userId);
if (x != null)
{
await cacheProvider.Cache(x); // THIS is the last line to be called from this method, it never returns
SetCached(true);
}
}
catch (Exception ex)
{
AddValidationError(ex.Message);
}
}
public async Task Cache(dynamic obj)
{
await database.InsertAllAsync((IEnumerable)obj); // this runs
} // this is the last breakpoint to be hit
编辑:减少代码以使问题更清晰。
答案 0 :(得分:1)
这可能是iOS设备在动态支持方面的已知限制的问题。 Xamarin关于这个here和一个帖子here的信息(但是从线程的最后一篇文章可以看出,可能有一些动态支持)。
关于这一点的棘手问题是动态代码在iOS模拟器上运行良好(因为Mac支持JIT)但在iOS设备上会失败(因为iOS设备硬件已经专门禁用它)。
答案 1 :(得分:0)
我有部分解决方案。删除await 等待cacheProvider.Cache(x); 在Execute方法中,它返回Execute方法,操作就能成功完成。它是部分的,因为它只适用于调试,当我在adhoc配置中通过我的CI运行它仍然无法完成。