2017-01-01 5 views
0

私は、Webサービスからのアイテムのリストを比較し、データベース上のローカルコピーを同期する同期メソッドを持っています。マルチスレッドEFコードで最適化を使用できます

このコードは機能し、うまく動作しますが、私は最適化できると感じています。私たちは20〜15の関連テーブルを持っている20万アイテムを扱っていますので、それほどの作業ではありませんが、通常は30〜60分かかることがあります。それは適切にすべてのコアを使用し、問題はありません。

このコードは、削除された項目を削除します。

var updatedListings = await _listingFeedService.GetListingsAsync(); 
      Object lockContext = new Object(); 
      var counter = 0; //Save changes every 300 listings 
      var parallelOptions = new ParallelOptions 
      { 
       MaxDegreeOfParallelism = Environment.ProcessorCount - 1 
      }; 

      //1.- Delete sold listings 
      var soldListings = _listingRepo.GetSoldListings(updatedListings); 
      Parallel.ForEach(soldListings, parallelOptions, (sl) => 
      { 
       try 
       { 
        lock (lockContext) 
        { 
         _listingRepo.DeleteByMlsId(sl); 
         counter++; 
         if (counter > 100) 
         { 
          _listingRepo.Save(); 
          counter = 0; 
         } 
        } 
       } 
       catch (Exception e) 
       { 
        syncReport.AppendLine($"{System.DateTime.Now} - ListingId: {sl} Status:Error | Error: { e.Message}"); 
       } 
      }); 
      _listingRepo.Save(); 

このコードは

//3.- Save the new listings 
      var newListings = _listingRepo.GetNewListings(updatedListings); 
      counter = 0; 
      Parallel.ForEach(newListings, parallelOptions, newListingMlsId => 
      { 
       try 
       { 
        Listing listingToUpdate; 
        listingToUpdate = _listingFeedService.GetListingByMlsIdAsync(newListingMlsId).Result; 

        lock (lockContext) 
        { 
         _listingRepo.Add(listingToUpdate); 
         if (listingToUpdate.MlsId != 0) 
         { 
          counter++; 
          if (counter > 50) 
          { 
           _listingRepo.Save(); 
           counter = 0; 
          } 
         } 
        } 
       } 
       catch (Exception e) 
       { 
        syncReport.AppendLine($"{System.DateTime.Now} - ListingId: {newListingMlsId} Status:Error | Error: { e.Message}"); 
       } 
      }); 
      _listingRepo.Save(); 
+0

これは、http://codereview.stackexchange.com/より適切です。 –

+0

申し訳ありません。 – adam3039

+0

さて、今のところ、コードレビューに属しています。一方、あなたが特定の問題を抱えていて助けが必要な場合は、ここで質問することができますが、解決しようとしている問題を正確に特定する必要があります。意味がありますか? –

答えて

1

ストアドプロシージャを作成し、削除するアイテムのすべてを渡す新しいアイテムを挿入します。これは、データベースへの1回の旅行で削除全体を行います。

新しいリストの挿入にはSqlBulkCopyを使用してください。

関連する問題