В консольном приложении я начинаю со списка и открываю несколько задач для их обработки, например:
List<Task> tasks = new List<Task>();
tasks.Add(Task.Run(() => { Elabor(el.Take(1000).ToList(), listLogDequeues); }));
tasks.Add(Task.Run(() => { Elabor(el.Skip(1000).Take(1000).ToList(), listLogDequeues); }));
tasks.Add(Task.Run(() => { Elabor(el.Skip(2000).Take(1000).ToList(), listLogDequeues); }));
Task.WaitAll(tasks.ToArray());
el
и ListLogDequeue
- это ConcurrentBag<T>
, а внутри функции целое число безопасно увеличивается с помощью Interlocked.Add
.
Это позволяет мне запускать три / четыре задачи и выполнять операции, но внутри Elabor используются Entity Framework и MongoClient, как два репозитория, введенных с помощью Ninject в моем консольном приложении Main. Каждая функция строит и использует свой контекст, но я не понимаю, насколько параллелизм и безопасность потоков могут быть здесь.
EF:
public OutAnag GetAnagById(string id)
{
try
{
using (var c = new Context())
{
return c.Anag.AsNoTracking().FirstOrDefault(e => e.Id == id);
}
}
catch (Exception ex)
{
return null;
}
}
Монго:
public bool SetElab(string guid)
{
Context dbContext = new Context();
try
{
var filter = Builders<Anag>.Filter.Where(m => m.Guid == guid);
var update = Builders<Anag>.Update.Set(m => m.DataElaborazione, DateTime.Now);
var options = new FindOneAndUpdateOptions<Anag>();
dbContext.Anag.FindOneAndUpdate(filter, update, options);
}
catch (Exception e)
{
return false;
}
return true;
}