Parallel.Foreach and BulkCopy



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

foreach (var systemDto in systems)
{
var sourceConnectionString = _systemService.GetConnectionStringAsync(systemDto.Ip).Result;
var dbConnectionFactory = new DbConnectionFactory(sourceConnectionString,
"System.Data.SqlClient");
var dbContext = new DbContext(dbConnectionFactory);
var storageRepository = new StorageRepository(dbContext);
var usedStorage = storageRepository.GetUsedStorageForCurrentMonth();
var dtUsedStorage = new DataTable();
dtUsedStorage.Load(usedStorage);
var dcIp = new DataColumn("IP", typeof(string)) {DefaultValue = systemDto.Ip};
var dcBatchDateTime = new DataColumn("BatchDateTime", typeof(string))
{
DefaultValue = batchDateTime
};
dtUsedStorage.Columns.Add(dcIp);
dtUsedStorage.Columns.Add(dcBatchDateTime);
using (var blkCopy = new SqlBulkCopy(destinationConnectionString))
{
blkCopy.DestinationTableName = "dbo.tbl";
blkCopy.WriteToServer(dtUsedStorage);
}
}

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

--编辑1

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

System.NotSupportedException:对此启动了第二个操作上一个异步操作完成之前的上下文。使用"等待"以确保任何异步操作都已完成然后在此上下文上调用另一个方法。任何实例成员不能保证线程安全。

有什么想法吗?

通常,它会被阻塞,并等待上一次操作完成。

有一些因素可能会影响SqlBulkCopy是否可以并行运行。

我记得在将Parallel功能添加到我的.NET Bulk Operations时,我很难使它并行正常工作,但当表没有索引时(可能从来都不是这样)

即使在工作时,性能的提升也不会快很多。

也许你会在这里找到更多信息:MSDN-使用表级锁定并行导入数据

最新更新