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

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

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

我调查了一下:

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

但我不知道该怎么做。请帮助我:

下面是代码:

public List SearchItems(string ItemToSearch, string AuthenticationToken) { var _list= getRecords from Api //100 records //Task.Factory.StartNew(() => _objBLLNutritionLog.FillNutritionTable(_tempList)); // also tried this saveToDb(_list); // need to run this asynchronously Or parallel (Taking long time) return _list; } 

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

谢谢

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

所以让我们开始吧。 首先使用async标记您的SearchItems函数:

 public async List SearchItems(string ItemToSearch, string AuthenticationToken) { } 

然后你可以await saveToDb任务:

 var result = await Task.Factory.StartNew(()=> saveToDb(_list)); 

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

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

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

最后,增加数据库插入的最佳方法是使用批量操作,如SQL Server的BULK INSERT插入大量记录,或者使用SqlBulkCopy类。 这些操作经过优化,可处理大量记录(数千个)。

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

除非操作真的是异步,否则我建议不要使用async-await 。 如果您的数据库客户端支持异步操作,那么继续,但使用Task.Factory.StartNewTask.Run只是将工作卸载到另一个线程。

但是,您可以并行运行这些任务,但只有在数据库并行运行时才会更快。 如果让我们说它是一个SQL数据库并且您将数据插入到同一个表中,那么可能会锁定表并使您的任务运行得更慢。

但是,如果您想要的是不阻止调用者并在完全插入数据库之前返回结果,则可以执行以下操作:

 public List SearchItems(string ItemToSearch, string AuthenticationToken) { var list = getRecords from Api Task.Run(() => SaveToDB(list)); return list; } 

使用以下内容:

 FX db1 = new FX(); LibraryManagementSystemEntities db2 = new LibraryManagementSystemEntities(); Thread thread1 = new Thread(delegate() { db1.insert2(TextBox1.Text,TextBox2.Text); db2.insert1(TextBox1.Text,TextBox2.Text); }); thread1.Start();