2016-06-10 7 views
0

У меня есть 6000 элементов и каждый элемент процесса на msSql с параллельным foreach. Когда я запустил максимальный размер пула приложений, вы достигли исключения через некоторое время. Я попробовал MaxDegreeOfParallelism набор 50 и я не получаю сообщение об ошибке, но приложение работает очень медленно.Единица работы, репозиторий, структура объекта/максимальный размер пула/параллельный foreach

Что я могу сделать для этой ошибки.

мои коды таковы:

using RPandUOW.EntityModel; 
using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Linq.Expressions; 

namespace RPandUOW.Repositories 
{ 
    public interface IGenericRepository<T> 
     where T:class 
    { 
     T FindById(object EntityId); 
     IEnumerable<T> Select(Expression<Func<T, bool>> Filter = null); 
     void Insert(T Entity); 
     void Update(T Entity); 
     void Delete(object EntityId); 
     void Delete(T Entity); 
    } 

    public class ShopRepository<T> 
     :IGenericRepository<T> 
     where T:class 
    { 
     private ShopContext _context; 
     private DbSet<T> _dbSet; 
     public ShopRepository(ShopContext Context) 
     { 
      _context = Context; 
      _dbSet = _context.Set<T>(); 
     } 
     public virtual T FindById(object EntityId) 
     { 
      return _dbSet.Find(EntityId); 
     } 
     public virtual IEnumerable<T> Select(Expression<Func<T, bool>> Filter = null) 
     { 
      if (Filter != null) 
      { 
       return _dbSet.Where(Filter); 
      } 
      return _dbSet; 
     } 
     public virtual void Insert(T entity) 
     { 
      _dbSet.Add(entity); 
     } 
     public virtual void Update(T entityToUpdate) 
     { 
      _dbSet.Attach(entityToUpdate); 
      _context.Entry(entityToUpdate).State = EntityState.Modified; 
     } 
     public virtual void Delete(object EntityId) 
     { 
      T entityToDelete = _dbSet.Find(EntityId); 
      Delete(entityToDelete); 
     } 
     public virtual void Delete(T Entity) 
     { 
      if (_context.Entry(Entity).State == EntityState.Detached) //Concurrency için 
      { 
       _dbSet.Attach(Entity); 
      } 
      _dbSet.Remove(Entity); 
     } 
    }} 

using RPandUOW.EntityModel; 
using RPandUOW.Repositories; 
using System; 
using System.Transactions; 

namespace RPandUOW.UnitOfWorks 
{ 
    public interface IUnitOfWork 
     :IDisposable 
    { 
     void Save(); 
     // Başka operasyonlar da tanımlanabilir. 
     // void OpenTransaction(); 
     // void CloseTransaction(); 
     // gibi 
    } 

    public class ShopUnitOfWork 
     :IUnitOfWork 
    { 
     private ShopContext _context = new ShopContext(); 
     private ShopRepository<Category> _categoryRepository; 
     private ShopRepository<Product> _productRepository; 
     private bool _disposed = false; 
     public ShopRepository<Category> CategoryRepository 
     { 
      get 
      { 
       if (_categoryRepository == null) 
        _categoryRepository = new ShopRepository<Category>(_context); 
       return _categoryRepository; 
      } 
     } 
     public ShopRepository<Product> ProductRepository 
     { 
      get 
      { 
       if (_productRepository == null) 
        _productRepository = new ShopRepository<Product>(_context); 
       return _productRepository; 
      } 
     } 
     public void Save() 
     { 
      using (TransactionScope tScope = new TransactionScope()) 
      { 
       _context.SaveChanges(); 
       tScope.Complete(); 
      } 
     } 
     protected virtual void Dispose(bool disposing) 
     { 
      if (!this._disposed) 
      { 
       if (disposing) 
       { 
        _context.Dispose(); 
       } 
      } 
      this._disposed = true; 
     } 
     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 
    } 
} 

И у меня есть два способа, как это для необработанного SQL execut: Context.Database.SqlQuery<string>(sqlQuery)

Parallel.ForEach(items, item => 
{ 
result = bl.run(item); 
}); 
+0

Yeap, он работает 'MaxDegreeOfParallelism = 50' –

ответ

0

Вы можете увеличить размер пула и увеличить число параллельных потоков.

Я также подозреваю, что у вас может быть проблема с экземпляром/закрытием с вашим шаблоном UoW/Repo. Как вы проводите свои занятия? Больше кода поможет.

+0

привет, добавил примеры моих кодов. –

+0

У вас есть каждый метод сохранения как транзакция, но это уже транзакция - удалите этот код транзакции. Также, как упоминалось выше, параллельные задачи не всегда подходят для запросов. Что происходит внутри вашего метода Run()? выбрать, затем вставить/обновить? Вы делаете много из них параллельно, и все они в завернутой транзакции могут вызывать блокировки таблиц. –

+1

И, наконец, похоже, вам нужно выяснить, где проблема с производительностью (называемая горячей точкой), а затем реорганизовать код вверх, чтобы сделать его эффективным. –