【发布时间】:2017-11-14 11:08:57
【问题描述】:
我有一个 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);
}
}
因为检索数据的系统很多,不知道能不能用Parrel.Foreach循环呢? BulkCopy 是否会在 WriteToServer 期间锁定表,并且下一个 WriteToServer 将等到上一个完成?
-- 编辑 1
我已将 Foreach 更改为 Parallel.Foreach,但我遇到了一个问题。在这个循环中,我有异步方法:_systemService.GetConnectionStringAsync(systemDto.Ip) 这行返回错误:
System.NotSupportedException:第二个操作开始于此 前一个异步操作完成之前的上下文。采用 'await' 以确保所有异步操作都已完成 在此上下文中调用另一个方法之前。任何实例成员 不保证是线程安全的。
任何想法我该如何处理?
【问题讨论】:
-
取决于您的批量复制、其编写方式和工作方式。如果当前连接持续存在,那么它可能会阻止它
标签: sqlbulkcopy parallel-foreach