2017-07-18 35 views
-1

比方说,我有一个方法运行大量简单查询而不重载数据库的最有效方法是什么?

public async Task SaveItemToDb(ItemEntity item) { ... } 

节省单个项目数据库,并让我们说我需要50万名的项目运行它,出于商业原因,我不能做批量操作(例如,我不能做一个SaveItemsToDb(IEnumerable<ItemEntity> items))。

我想知道什么最好的方法是做到这一点,这样我就不会重复数据库同时运行的查询,但每个查询可以被认为是彼此独立的。这是Task.WhenAll(...)的情况吗?

+0

帮助db的一种方法是将所有查询编译到一个块并执行它。 –

+0

@ShemeerBK你能详细点吗? – user7127000

+0

嗨,我不知道如果我得到你的方案是正确的,在我以前的项目中,我有这样的问题,我不得不为每个创建的对象运行 插入语句。问题是,在数据层每次连接 已打开,查询已执行,并在此后关闭连接。这拖延了插入操作 一段时间。简单的解决方法是收集所有这些插入查询的类,并用100个带有定时器的块 执行。可能会有助于你的情况。 –

回答

-1

您可以确保您最多可以运行numTasks。最后的棘手问题是确保您等到所有任务完成。不幸的是CountDownEvent没有异步版本,所以它阻止了,但也许这不是什么大不了的事。

以下代码无法正确处理任何任务中的错误。你可能想要改进它。

async Task ProcessTasks(IEnumerable<Task> tasks, int numTasks){ 
    var count = new CountDownEvent(0); 
    SemaphoreSlim semaphore = new SemaphoreSlim(numTasks); 
    foreach(var task in tasks){ 
     await semaphore.WaitAsync(); 
     task.ContinueWith(_=>{ 
      semaphore.Release(); 
      count.Signal(); 
      } 
     ); 
    } 
    count.Wait(); // Wait till the count reaches zero 
} 
相关问题