异步批量复制
Async for Bulk copy
我有很多数据table要批量插入数据库table
由于尺寸较大,一个 table 需要 5 分钟才能完成插入。 2 tables 花了我 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;
}
Task.WhenAll
returns一个需要等待的Task对象或后面的代码继续正常执行,main方法立即退出。
由于这是一个控制台应用程序,主程序不能标记为 async
,您可以使用:
Task.WhenAll(insert1, insert2).Wait(); // wait for the returned Task object to Complete
正常用法是:await (Task.WhenAll(...))
但您不能将 Main 标记为 async
方法。
Task.Run
在这里没有添加任何有用的东西。另外,不要尝试在方法的两次运行之间共享单个连接 object。类似于:
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
语句在批量加载完成之前不会关闭您的连接。
此外,我切换到使用 Task.WaitAll
实际上 等待 ,这比使用 Task.WhenAll
然后立即调用 Wait
更惯用就可以了。
我有很多数据table要批量插入数据库table 由于尺寸较大,一个 table 需要 5 分钟才能完成插入。 2 tables 花了我 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;
}
Task.WhenAll
returns一个需要等待的Task对象或后面的代码继续正常执行,main方法立即退出。
由于这是一个控制台应用程序,主程序不能标记为 async
,您可以使用:
Task.WhenAll(insert1, insert2).Wait(); // wait for the returned Task object to Complete
正常用法是:await (Task.WhenAll(...))
但您不能将 Main 标记为 async
方法。
Task.Run
在这里没有添加任何有用的东西。另外,不要尝试在方法的两次运行之间共享单个连接 object。类似于:
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
语句在批量加载完成之前不会关闭您的连接。
此外,我切换到使用 Task.WaitAll
实际上 等待 ,这比使用 Task.WhenAll
然后立即调用 Wait
更惯用就可以了。