【问题标题】:C# Xamarin Async Task in Loop within an Async Task异步任务中循环中的 C# Xamarin 异步任务
【发布时间】:2017-09-30 13:09:24
【问题描述】:

我认为我遇到了赛车问题,无法自己解决。

在 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 db 中的现有记录,而是运行:

await Conn.InsertAsync(v);

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

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

【问题讨论】:

  • 当“其他 9 个失败”时,请编辑您的问题并解释他们是如何失败的。你有例外吗?程序锁定?什么?
  • 我更新了原帖。它失败的 9 次迭代不是因为查询。
  • 这可能是线程问题吗?
  • 那么-1 是干什么用的?这是一个愚蠢的问题还是什么?

标签: c# xamarin async-await task


【解决方案1】:

问题解决了。我雇了一个承包商来做第一个 SQLite 数据库工作,我终于看到他在 SQLite 表的 VendorID 字段上添加了一个唯一约束(主键),这不是唯一值字段。因此,在发布更新数据时,它没有发布 10 条记录,而是 1 条记录 10 次。当更新循环运行时,它在第一次迭代中找到了所有 10 条记录,更新了所有 10 条,然后找不到其他 9 条记录,因为它们根本不存在。程序每次运行它就增加了9条记录,并且由于主键约束错误,它又多次增加了相同的记录。如果代码看起来正确并且应该可以工作,请先查看您认为“正确”的内容。如果灯灭了,你不拆墙检查接线,你先检查灯泡,对吧?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2014-04-19
    • 2016-05-08
    • 2014-07-24
    • 2019-02-19
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多