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.请建议.
谢谢
我希望你使用的是.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)
数据库命令的异步或并行执行不会加速不良数据库代码,但会损害性能。100 条记录是一个非常小的数字,这意味着数据库访问代码中发生了一些奇怪的事情。如果您并行执行多个语句,则不会解决此问题。
首先,为了并行执行操作,每个操作都需要一个单独的连接——这会导致更多的锁、更多的阻塞、更多的时间花费在网络上。
其次,建立连接和通过网络发送数据所花费的时间比执行实际的INSERT
或UPDATE
. 即使您为每条记录执行一条语句,也不应该有任何性能问题。如果你这样做了,那可能是因为saveToDb
做了一些奇怪的事情,或者你没有正确的索引,或者语句执行得非常糟糕。
最后,增加数据库插入的最好方法是使用批量操作,比如 SQL ServerBULK INSERT
一次性插入大量记录,或者SqlBulkCopy类。这些操作经过优化以处理大量记录(数千)。
在任何情况下,修复语句和数据库访问代码比并行运行语句要付出更多的代价。
归档时间: |
|
查看次数: |
12024 次 |
最近记录: |