在控制台应用程序中,我从一个列表开始,并打开多个任务来处理它们,例如:
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,这是在控制台应用程序Main中通过Ninject注入的两个回购协议。每个函数都会构建和使用它的上下文,但是我不了解并发性和线程安全性是否会在这里以及如何受到损害。
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;
}