[英]C# Xamarin Async Task in Loop within an Async 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數據庫中找到匹配項; 在其他九次迭代中,即使這些記錄存在於SQLite DB中,也找不到匹配項。
if (containsList != null && containsList.Count > 0)
在第二個及隨后的循環中返回count = 0,因此它運行而不是更新SQLite db中的現有記錄:
await Conn.InsertAsync(v);
導致將重復的記錄插入SQLite數據庫中,而不是更新現有記錄中的lastupdatedate字段。
我使用了一個SQLite db Firefox插件對所有10條記錄使用相同的查詢,並且該查詢找到了所有10條記錄,因此不是查詢。 當它在第二次及之后的一次循環中使ascyn任務將其鎖定時,是否可能? 沒有例外。
問題解決了。 我雇了一個承包商來完成第一個SQLite數據庫工作,最后我看到他在SQLite表的VendorID字段上添加了唯一約束(主鍵),該約束不是唯一值字段。 因此,當發布更新數據時,它不會發布10條記錄,而是發布10條記錄。 當更新循環運行時,它在第一次迭代中找到了所有10條記錄,更新了所有10條記錄,然后找不到其他9條記錄,因為它們根本不在那。 每次程序運行時,它都會添加9條記錄,並且由於錯誤的主鍵約束,它還會多次添加同一條記錄。 如果代碼看起來正確並且可以正常工作,請首先查看您認為“正確”的那些事情。 如果燈熄滅,您無需撕開牆壁檢查布線,而是先檢查燈泡,對嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.