【发布时间】: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