我有一个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;确保完成任何异步操作 在此上下文中调用另一个方法之前。任何实例成员 不保证是线程安全的。
任何想法我该如何处理?
答案 0 :(得分:1)
一般情况下,它会被阻止,并会等到上一个操作完成。
如果SqlBulkCopy
可以并行运行,可能会影响某些因素。
我记得在将Parallel
功能添加到我的.NET Bulk Operations时,我很难让它并行运行,但是当表没有索引时(这可能永远不会如此) )
即使工作,性能提升也不是很快。
也许您会在此处找到更多信息:MSDN - Importing Data in Parallel with Table Level Locking