私はレースの問題があり、それを自分で解決できないと思います。C#非同期タスク内のループ内のXamarin Asyncタスク
Xamarin Androidでは、Azure SQLのデータを取得していて、ループ内のローカルSQLite dbを更新しようとしています。のみ****
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;
}
}
私は***マークされた行は、ONLY最初の反復ワークスループの最初の繰り返しに動作します:
は、ここでは、コードです。その行で検索されている10個のレコードと一致するSQLite dbに10個のテストレコードがありますが、最初のレコードのみが見つかります。他の9は失敗する。
私は非同期タスクとは何か関係がありますが、修正できないようです。私は間違って何をしていますか?
更新: 明確にするために、私がマークアウトした行は初めて動作します。これはSQLite DB内で一致するものを見つけ出します。他の9回の反復では、それらのレコードがSQLite DBに存在しても一致するものは見つかりません。
if (containsList != null && containsList.Count > 0)
戻り2回目以降のループで= 0をカウントするので、代わりにSQLiteのDBに既存のレコードを更新する、それが実行されます重複レコードをもたらす
await Conn.InsertAsync(v);
代わりにSQLiteのDBに挿入され既存のレコードのlastupdatedateフィールドを更新します。
SQLite db Firefoxプラグインを使用して、10個のレコードすべてに対して同じクエリを使用しました。クエリは10個すべてのレコードを検索して、クエリではありません。 ascynタスクがロックアウトしている2回目以降のループが発生する可能性はありますか?例外はありません。
「もう一方の9が失敗したら」質問を編集し、どのように失敗しているか説明してください。あなたには例外がありますか?プログラムはロックされますか?何? –
元の投稿を更新しました。失敗した9回の反復は、クエリのためではありません。 –
これはスレッドの問題でしょうか? –