我有一个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:在以前的异步操作完成之前,在此上下文上启动第二个操作。在此上下文中调用另一个方法之前,请使用“等待”确保任何异步操作都已完成。不保证任何实例成员都是线程安全的。
我该怎么处理这件事?
发布于 2017-11-14 14:41:03
一般情况下,它将被阻塞,并将等待上一次操作完成。
如果可以并行或不并行地运行SqlBulkCopy,可能会影响到一些因素。
我记得当我将Parallel特性添加到我的.NET批量操作中时,我很难使它并行地正确工作,但是当表没有索引时(很可能从来没有索引),这种方法效果很好。
即使在工作的时候,性能的提高也不会快得多。
也许您会在这里找到更多信息:MSDN -通过表级锁定并行导入数据
https://stackoverflow.com/questions/47284237
复制相似问题