簡體   English   中英

異步任務中循環的C#Xamarin異步任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM