C# 异步大容量复制

C# 异步大容量复制,c#,asynchronous,sqlbulkcopy,C#,Asynchronous,Sqlbulkcopy,我有很多数据表要插入到数据库表中 由于尺寸较大,一张表需要5分钟才能完成插入。两张桌子花了我10分钟 static void Main(string[] args) { DataTableBulkInsert(DataTable1); DataTableBulkInsert(DataTable2); } public static void DataTableBulkInsert(DataTable Table){ SqlBulkCopy sqlBulkCopy = n

我有很多数据表要插入到数据库表中 由于尺寸较大,一张表需要5分钟才能完成插入。两张桌子花了我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, 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;
 }
static void Main(字符串[]args)
{
var insert1=Task.Run(异步()=>wait-DataTableBulkInsert(DataTable1);
var insert2=Task.Run(异步()=>wait-DataTableBulkInsert(DataTable2);
任务.WhenAll(插入1,插入2);
}
公共静态异步任务DataTableBulkInsert(DataTable表)
{
尝试
{
SqlBulkCopy SqlBulkCopy=新的SqlBulkCopy(myConnection);
sqlBulkCopy.DestinationTableName=“dbo.DatabaseTable”;
myConnection.Open();
等待sqlBulkCopy.WriteToServerAsync(表);
myConnection.Close();
}
捕获(例外(e))
{
控制台。写入(e);
}
返回true;
}

任务。当所有
返回一个需要等待的任务对象,或者随后的代码继续正常执行,并且主方法立即退出时

由于这是一个控制台应用程序,主应用程序不能标记为
async
,因此可以使用:

Task.WhenAll(insert1, insert2).Wait(); // wait for the returned Task object to Complete

通常的用法是:
wait(Task.whalll(…)
,但不能将Main标记为
async
方法。

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);
      }
 }
通常情况下,
return await
是一种反模式,但在这里您希望使用它,以便在批量加载完成之前,
using
语句不会关闭连接


另外,我转而使用which实际等待,这比使用
任务更为惯用。当所有
时,然后立即对其调用
Wait

您是否尝试过在
控制台上设置调试器。write(e);
?根据我的经验,异步方法通常会吞下异常。使用
Task.WaitAll(insert1,insert 2)
在我添加了.Wait()之后它就可以工作了;但是,现在我遇到了连接打开和关闭的问题。如何允许一个连接满足多个bulkcopy?Jonathan您可能需要为每个任务创建一个单独的连接。或者在
任务之后关闭连接。whalll(insert1,insert2)。Wait();
line of code.return await是一种反模式-非常有趣。你能提供一些关于这方面的更多信息吗?@smoksnes-
await
是一种暂停当前方法直到其他代码完成其工作的方法。如果你的方法在恢复时要做的只是说“我完成了”那么你为什么要做所有的努力呢?也就是说,实际的反模式是
return await
,如果这是方法中唯一的
await
(如这里所示),并且它不在
try
块中,最后使用
块或
使用
块(在这种情况下,在
return
之后还有其他代码要运行)@smoksnes-甚至有人要求编译器对其进行优化。感谢您的解释。当您的任务没有对象表达式时,我还需要返回吗?我有此错误任务没有对象表达式返回错误