在.net c中异步或并行地保存数据库中的记录

Ger*_*rry 6 .net c# parallel-processing asynchronous async-await

我有一项服务,我必须在从API获取后将大量记录保存到数据库.同时我必须将这些记录从服务返回给调用者.但问题是我在DB中保存记录需要很长时间,因此服务变慢.我搜索了这个并发现了一些并行任务或异步等待的概念.

我是这个概念的新手,对它的用法感到困惑

我调查了一下:

运行多个C#任务异步 http://msdn.microsoft.com/en-us/library/hh191443.aspx

但我不知道该怎么办.请帮助我:

下面是代码:

public List<SearchedItems> SearchItems(string ItemToSearch, string AuthenticationToken)
{
    var _list= getRecords from Api //100 records    

     //Task<int>.Factory.StartNew(() => _objBLLNutritionLog.FillNutritionTable(_tempList)); // also tried this

    saveToDb(_list); // need to run this asynchronously Or parallel (Taking long time)

    return _list;

}
Run Code Online (Sandbox Code Playgroud)

我想将结果返回给调用者,另一方面想要填充db.请建议.

谢谢

Xel*_*lom 9

我希望你使用的是.NET 4.5.

所以让我们开始吧.首先标记您的SearchItems功能async:

public async List<SearchedItems> SearchItems(string ItemToSearch, string AuthenticationToken)
{
}
Run Code Online (Sandbox Code Playgroud)

然后你可以await执行saveToDb任务:

var result = await Task.Factory.StartNew(()=> saveToDb(_list));
Run Code Online (Sandbox Code Playgroud)


Pan*_*vos 5

数据库命令的异步或并行执行不会加速不良数据库代码,但损害性能。100 条记录是一个非常小的数字,这意味着数据库访问代码中发生了一些奇怪的事情。如果您并行执行多个语句,则不会解决此问题。

首先,为了并行执行操作,每个操作都需要一个单独的连接——这会导致更多的锁、更多的阻塞、更多的时间花费在网络上。

其次,建立连接和通过网络发送数据所花费的时间比执行实际的INSERTUPDATE. 即使您为每条记录执行一条语句,也不应该有任何性能问题。如果你这样做了,那可能是因为saveToDb做了一些奇怪的事情,或者你没有正确的索引,或者语句执行得非常糟糕。

最后,增加数据库插入的最好方法是使用批量操作,比如 SQL ServerBULK INSERT一次性插入大量记录,或者SqlBulkCopy类。这些操作经过优化以处理大量记录(数千)。

在任何情况下,修复语句和数据库访问代码比并行运行语句要付出更多的代价。