多线程EF代码可以使用优化

时间:2017-01-01 19:18:04

标签: c# multithreading entity-framework

我有一个sync方法,用于比较Web服务中的项目列表,并同步数据库中的本地副本。

这段代码可以正常运行,但我觉得可以优化它。我们正在处理200,000个项目,每个项目有10-15个相关表格,所以这不是一个小工作量,但通常需要大约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();

1 个答案:

答案 0 :(得分:1)

创建存储过程并将要删除的所有项目传递给它。这将在一次数据库中完成整个删除。

要插入新的商家信息,请使用SqlBulkCopy