Parallel.Foreach和BulkCopy

时间:2017-11-14 11:08:57

标签: sqlbulkcopy parallel-foreach

我有一个C#库,它连接到同一数据库结构的59个服务器,并将数据导入我的本地数据库到同一个表。此时我正在foreach循环中按服务器检索数据服务器:

+                                  results                                                         +
|                                                                                                  |
+--------------------------------------------------------------------------------------------------+
|   <td> 14</td><td>project name1</td><td><p>project desc 1</p></td><td>created at 1</td>          |                                                                                                  
|    <td> 13</td><td>project name2</td><td><p>project desc 2</p></td><td>created at 2</td>
|    <td> 12</td><td>project name3</td><td><p>project desc 3</p></td><td>created at 2</td>
+-------------------------------------------------------------------------------------------------
|                                other results of same date like 13                               |
+-------------------------------------------------------------------------------------------------+

因为有很多系统要检索数据,我想知道是否可以使用Pararel.Foreach循环? BulkCopy会在WriteToServer期间锁定表,而下一个WriteToServer会等到上一个完成吗?

- 编辑1

我已将Foreach改为Parallel.Foreach但我面临一个问题。在这个循环中我有异步方法:_systemService.GetConnectionStringAsync(systemDto.Ip) 并且此行返回错误:

  

System.NotSupportedException:对此启动了第二个操作   上一次异步操作完成之前的上下文使用   &#39;等待&#39;确保完成任何异步操作   在此上下文中调用另一个方法之前。任何实例成员   不保证是线程安全的。

任何想法我该如何处理?

1 个答案:

答案 0 :(得分:1)

一般情况下,它会被阻止,并会等到上一个操作完成。

如果SqlBulkCopy可以并行运行,可能会影响某些因素。

我记得在将Parallel功能添加到我的.NET Bulk Operations时,我很难让它并行运行,但是当表没有索引时(这可能永远不会如此) )

即使工作,性能提升也不是很快。

也许您会在此处找到更多信息:MSDN - Importing Data in Parallel with Table Level Locking