【发布时间】:2015-01-20 14:58:36
【问题描述】:
我有一个简单的场景,但我想知道我的方法是否正确,最好选择一个任务来保存我失败的订单,还是我可以启动并启动多个任务并等待它们全部完成完全的。在连接到 Db 和保存实体时,这种情况下的正确方法是什么。
我已经有一个基于单个任务的版本,可以将一个实体保存到数据库中。
public async static Task SaveOrdersAsync(OrderService oService, OrderItemService oiService, IEnumerable<OrderTemplate> toSaveList, IUnitOfWork uow, IProgress<string> progress)
{
var toSave = toSaveList as IList<OrderTemplate> ?? toSaveList.ToList();
var tasks = new Task[toSave.Count()];
for (var i = 0; i < tasks.Length; i++)
{
var i1 = i;
tasks[i] = new Task(() => SaveToDb(oService, oiService, toSave.ElementAt(i1), uow), TaskCreationOptions.PreferFairness);
var message = string.Format("- Order: {0} has been resaved.\n", toSave.ElementAt(i1).Order.FriendlyId);
if (progress != null)
progress.Report(message);
}
await Task.WhenAll(tasks);
}
目前,我已经对上述内容进行了测试,并且认为由于进度条一直在循环,因此任务尚未开始。我的假设是 Task.WhenAll 应该为我开始我的任务 - 这就是我的想法?
或者应该在循环中使用它:
tasks[i] = Task.Run(() => SaveToDb(oService, oiService, toSave.ElementAt(i1), uow));
我想我很接近,只是希望有人告诉我这样做是否正确。
反馈合并版本:
public async static Task SaveOrdersAsync(OrderService oService, OrderItemService oiService, IEnumerable<OrderTemplate> toSaveList, IUnitOfWork uow, IProgress<string> progress)
{
var saveList = toSaveList as IList<OrderTemplate> ?? toSaveList.ToList();
var saveTask = Task.Run(() =>
{
foreach (var ot in saveList)
{
SaveToDbBatch(oService, oiService, ot);
var message = string.Format("- Order: {0} has been resaved.\n", ot.Order.FriendlyId);
if (progress != null)
progress.Report(message);
}
});
await saveTask;
await Cache.UoW.SaveAsync();
}
【问题讨论】:
标签: c# .net task-parallel-library async-await .net-4.5