在不重载db的情况下运行大量简单查询的最有效方法是什么?

时间:2017-07-18 05:52:35

标签: c# .net sql-server asynchronous async-await

假设我有一个方法

class Player(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        self.images = player_images
        self.rects = [image.get_rect() for image in self.images]

保存数据库中的单个项目,让我们说我需要运行500,000个项目,并且出于商业原因我无法进行批量操作(例如,我无法创建public async Task SaveItemToDb(ItemEntity item) { ... } )。

我想知道最好的方法是什么,以便我不会使用同时运行的查询重载数据库,但每个查询可以被认为是彼此独立的。这是SaveItemsToDb(IEnumerable<ItemEntity> items)的情况吗?

1 个答案:

答案 0 :(得分:-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
}