异步任务中循环中的C#Xamarin异步任务

时间:2017-05-02 21:30:08

标签: c# xamarin async-await task

我认为我有赛车问题而无法自行解决。

在Xamarin Android中,我从Azure SQL获取数据并尝试在循环中更新本地SQLite数据库。

以下是代码:

        foreach (var hotItem in updatedData)
        {
            var updated = await vendorController.ContainsVideoUrlAndUpdate(hotItem, date);

            if (!updated)
                await vendorController.AddUpdatedData(hotItem);
        }


        public async Task<bool> ContainsVideoUrlAndUpdate(List<VideoItem> updateDataList, DateTime lastDateUpdated) {
        try
        {
            foreach (VideoItem v in updateDataList)
            {
                ***WORKS ONLY FIRST ITERATION****var containsList = (await Conn.Table<VideoItem>().Where(o => (o.VideoURL == v.VideoURL && o.ZipCode == v.ZipCode) || (o.VideoURL == v.VideoURL && o.CityWide == true)).ToListAsync());****************
                if (containsList != null && containsList.Count > 0)
                {
                    foreach (var currData in containsList)
                    {
                        currData.LastUpdated = lastDateUpdated.ToString();
                        await Conn.UpdateAsync(currData);
                    }
                }
                else
                {
                    await Conn.InsertAsync(v);
                }
            }

            return true;
        }
        catch (SQLiteException ex)
        {
            Log.Info("Exception Updating LocalVideoList.sqlite DB", ex.Message);
            return false;
        }
    }

我标记为*** WORKS ONLY FIRST ITERATION ****的行仅适用于循环的第一次迭代。即使我在SQLite数据库中有10条测试记录与该行中搜索的10条记录相匹配,但只找到第一条记录。其他9人失败了。

我认为它必须与异步任务有关,但我似乎无法修复它。我做错了什么?

更新: 为了澄清,我标记的行第一次工作 - 它在SQLite DB中找到匹配;在其他九个迭代中,即使这些记录存在于SQLite DB中,它也找不到匹配项。

 if (containsList != null && containsList.Count > 0)

在第二个和后续循环上返回count = 0,因此它不会更新SQLite数据库中的现有记录,而是运行:

await Conn.InsertAsync(v);

导致在SQLite DB中插入重复记录,而不是更新现有记录中的lastupdatedate字段。

我使用SQLite db Firefox插件对所有10条记录使用相同的查询,查询查找所有10条记录,因此它不是查询。当ascyn任务将其锁定时,它是否可能循环第二次及以后的次数?没有例外。

1 个答案:

答案 0 :(得分:0)

问题解决了。我聘请了一个承包商来完成第一个SQLite数据库工作,我终于看到他在SQLite表的VendorID字段上添加了一个唯一的约束(主键),该字段不是唯一的值字段。因此,在发布更新数据时,它没有发布10条记录,但是1条记录10次。当更新循环运行时,它在第一次迭代中找到所有10条记录,全部更新10条记录,然后找不到其他9条记录,因为它们根本就不存在。它在每次程序运行时添加了9条记录,由于主键约束错误,它再次添​​加了相同的记录多次。如果代码看起来正确并且应该有效,请查看您认为正确的代码&#39;第一。如果灯熄灭,你不要撕掉墙壁检查接线,先检查灯泡,对吗?