批量复制异步

Jon*_*han 2 c# asynchronous sqlbulkcopy

我有很多数据表可批量插入数据库表中。由于尺寸较大,一张表需要5分钟才能完成插入。2张桌子花了我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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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;
 }
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 5

Task.Runs的添加这里没有什么用处。另外,请勿尝试在方法的两次运行之间共享单个连接对象。就像是:

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);
      }
 }
Run Code Online (Sandbox Code Playgroud)

通常,这return await是一种反模式,但是在这里您要使用它,以便该using语句直到大容量加载完成后才关闭您的连接。

另外,我切换到使用Task.WaitAll实际上等待的方法,它比使用更加惯用Task.WhenAll,然后立即调用Wait它。

  • @smoksnes-`await`是暂停当前方法直到其他代码完成其工作的一种方式。如果您的方法在恢复时要做的就是说“我完成了”,那么您为什么要全力以赴呢?话虽这么说,如果这是方法中的* only *“ await”(如此处所示),并且它不在带有“ finally”或“ using”的“ try”块内,则实际的反模式是“ return await” `块(在这种情况下,`return`之后还有其他代码要运行) (2认同)