【问题标题】:Parallel.Foreach and BulkCopyParallel.Foreach 和 BulkCopy
【发布时间】: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


【解决方案1】:

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

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

我记得在将Parallel 功能添加到我的.NET Bulk Operations 时,我很难让它并行正常工作,但当表没有索引时效果很好(可能永远不会出现这种情况)

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

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

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2013-10-06
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多