c# - 异步批量复制

标签 c# asynchronous sqlbulkcopy

我有相当多的数据表要批量插入到数据库表中 由于其尺寸较大,一张表需要 5 分钟才能完成插入。 2 table 花了我10分钟

static void Main(string[] args)
{
    DataTableBulkInsert(DataTable1);
    DataTableBulkInsert(DataTable2);
}

public static void DataTableBulkInsert(DataTable Table){
    SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(myConnection);
    sqlBulkCopy.DestinationTableName = "dbo.DatabaseTable";
    myConnection.Open();                    
    sqlBulkCopy.WriteToServer(Table);
    myConnection.Close();
}

我现在尝试对批量插入进行异步操作,但既没有插入任何数据,也没有给我错误。如何捕获异常?

static void Main(string[] args)
{
     var insert1 = Task.Run(async () => await DataTableBulkInsert(DataTable1);
     var insert2 = Task.Run(async () => await DataTableBulkInsert(DataTable2);
     Task.WhenAll( insert1, insert2);
}

public static async Task<Boolean> DataTableBulkInsert(DataTable Table)
{
      try
      {
          SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(myConnection);
          sqlBulkCopy.DestinationTableName = "dbo.DatabaseTable";
          myConnection.Open();                    
          await sqlBulkCopy.WriteToServerAsync(Table);
          myConnection.Close();
      }
      catch (Exception (e))
      {
        console.write(e);
      }
      return true;
 }

最佳答案

Task.Run 在这里没有添加任何有用的内容。另外,不要尝试在方法的两次运行之间共享单个连接对象。像这样的东西:

static void Main(string[] args)
{
     var insert1 = DataTableBulkInsert(DataTable1);
     var insert2 = DataTableBulkInsert(DataTable2);
     Task.WaitAll( insert1, insert2);
}

public static async Task DataTableBulkInsert(DataTable Table)
{
      using(var localConnection = new SqlConnection(/* connection string */))
      {
          SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(localConnection );
          sqlBulkCopy.DestinationTableName = "dbo.DatabaseTable";
          localConnection.Open();                    
          await sqlBulkCopy.WriteToServerAsync(Table);
      }
 }

通常 return wait 是一种反模式,但在这里您希望使用它,以便 using 语句在批量加载完成之前不会关闭您的连接完成。

此外,我改用 Task.WaitAll实际上等待,这比使用Task.WhenAll然后立即调用Wait更惯用。

关于c# - 异步批量复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38759458/

相关文章:

c# - 分配大数组; OutOfMemoryException VS 溢出异常

swift - 使用异步搜索结果重新加载表

javascript - 将异步 api 转换为同步 api。 (我有充分的理由保证)

asynchronous - Kotlin 挂起函数递归调用

c# - MySqlBulkLoader 使用 DataTable 而不是文件

c# - CLR 如何知道装箱对象的类型?

c# - 从 FlowDocument 创建 XPS 文档并动态附加它

c# - Azure 存储 SAS 身份验证失败

c# - 让 SqlBulkCopy 在 MiniProfiler 中显示为 sql

sql - 使用 SqlBulkCopy 和 F# 在 SQL 中导出矩阵