我有一個簡單的方案,但我想知道如果我的方法是正確的,最好建議選擇一個任務來保存我的失敗的訂單,或者我可以開始並開始多項任務並等待他們全部完成。在涉及到連接到Db和保存實體時,此場景的正確方法是什麼。正確使用異步/等待多任務到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();
}
乾杯,斯蒂芬希望你會回覆。好酷看起來像我做了一些改變。 =) – IbrarMumtaz 2014-11-22 15:14:57