gpt4 book ai didi

c# - 正确使用 Async/Await for Multiple Tasks To Db

转载 作者:行者123 更新时间:2023-11-30 13:45:43 25 4
gpt4 key购买 nike

我有一个简单的场景,但我想知道我的方法是否正确,最好选择一个任务来保存我失败的订单,还是我可以启动并触发多个任务并等待它们全部完成完全的。在连接到 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();
}

最佳答案

What is the correct approach for this scenario when it comes to connecting to a Db and saving entities.

一般来说,你应该:

  1. 如果可能的话,分批保存。换句话说,调用单个方法同时更新多个记录。例如,EF 具有 SaveChangesAsync
  2. 为您的数据库使用自然的异步 API,而不是 Task.Run(或者 - 甚至更糟 - 任务构造函数)。例如,EF 具有 SaveChangesAsync

关于c# - 正确使用 Async/Await for Multiple Tasks To Db,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27078727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com