나는 경주 문제가 있다고 생각하며 직접 해결할 수 없습니다.비동기 작업 내에서 루프의 C# Xamarin 비동기 작업
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;
}
}
내가 *** 표시된 라인 만 첫 번째 반복을 작동하는 루프의 첫 번째 반복 작동 :
여기에 코드입니다. 그 라인에서 검색되는 10 개의 레코드와 일치하는 SQLite db에 10 개의 테스트 레코드가 있지만 첫 번째 레코드 만 발견됩니다. 나머지 9 개는 실패합니다.
비동기 작업과 관련이 있다고 생각하지만 해결할 수없는 것 같습니다. 내가 도대체 뭘 잘못하고있는 겁니까?
업데이트 : 분명히 말하자면, 내가 마크 아웃 한 라인은 처음으로 작동합니다 - 그것은 SQLite DB에서 일치하는 것을 찾습니다; 다른 9 개의 반복은 SQLite DB에 레코드가 존재하더라도 일치하는 항목을 찾지 못합니다.
if (containsList != null && containsList.Count > 0)
반환 두 번째와 이후의 루프에 = 0을 셀 수 있기 (위해) 때문에, 대신에 SQLite는 DB에 기존 기록을 갱신, 그것은 실행 : 중복 레코드의 결과
await Conn.InsertAsync(v);
대신 SQLite는 DB에 삽입되는 기존 레코드의 lastupdatedate 필드를 업데이트하는 중입니다.
SQLite db Firefox 플러그인을 사용하여 10 개의 레코드 모두에 대해 동일한 쿼리를 사용했으며 쿼리는 10 개의 레코드를 모두 찾았습니다. 따라서 쿼리가 아닙니다. 그것은 ascyn 작업이 그것을 잠그고있는 두 번째 및 후속 루프를 반복 할 때 가능할 수 있습니까? 예외는 없습니다.
"기타 9 실패"질문을 편집하고 실패한 경우 설명하십시오. 예외가 있니? 프로그램이 잠겨? 뭐? –
원래 게시물을 업데이트했습니다. 실패한 9 번의 반복은 쿼리 때문이 아닙니다. –
이 문제가 스레딩 문제 일 수 있습니까? –