2017-05-02 10 views
0

私はレースの問題があり、それを自分で解決できないと思います。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回目以降のループが発生する可能性はありますか?例外はありません。

+4

「もう一方の9が失敗したら」質問を編集し、どのように失敗しているか説明してください。あなたには例外がありますか?プログラムはロックされますか?何? –

+0

元の投稿を更新しました。失敗した9回の反復は、クエリのためではありません。 –

+0

これはスレッドの問題でしょうか? –

答えて

0

問題を解決しました。私は最初のSQLiteデータベース作業を請負業者に依頼していましたが、ついにSQLiteテーブルのVendorIDフィールドにユニークな値フィールドではない一意の制約(プライマリキー)を追加しました。したがって、更新データを転記したときには、10レコードを記録せず、1レコードを10レコードだけポストしました。更新ループが実行されると、最初の反復で10個のレコードがすべて検出され、10個すべてが更新され、残りの9個のレコードは検出されませんでした。プログラムが実行されるたびに9つのレコードが追加され、誤った主キー制約のために同じレコードが複数回追加されました。コードが正しく見えてうまくいく場合は、最初に「正しい」と思うものを見てください。ライトが消えたら、配線をチェックして壁を裂けず、まず電球をチェックします。そうですか?