Entity Framework и MongoClient с задачей - PullRequest
0 голосов
/ 16 января 2019

В консольном приложении я начинаю со списка и открываю несколько задач для их обработки, например:

    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;
    }
...