iOS在执行过程中删除任务

时间:2016-07-05 12:08:38

标签: c# xamarin xamarin.ios async-await xamarin.forms

某些事情正在使我的正在运行的任务超出代码中的某一点(请参阅下面的位置)。它只是停止执行。它只发生在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

编辑:减少代码以使问题更清晰。

2 个答案:

答案 0 :(得分:1)

这可能是iOS设备在动态支持方面的已知限制的问题。 Xamarin关于这个here和一个帖子here的信息(但是从线程的最后一篇文章可以看出,可能有一些动态支持)。

关于这一点的棘手问题是动态代码在iOS模拟器上运行良好(因为Mac支持JIT)但在iOS设备上会失败(因为iOS设备硬件已经专门禁用它)。

答案 1 :(得分:0)

我有部分解决方案。删除await     等待cacheProvider.Cache(x); 在Execute方法中,它返回Execute方法,操作就能成功完成。它是部分的,因为它只适用于调试,当我在adhoc配置中通过我的CI运行它仍然无法完成。