异步进行批量复制 [英] Async for Bulk copy
问题描述
我有很多数据表可批量插入数据库表中由于尺寸较大,一张桌子需要5分钟才能完成插入.2张桌子花了我10分钟
I have quite a few datatable to bulkinsert into databasetable Due to large size, one table took 5 min to complete insert. 2 tables took me 10 min
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();
}
我现在正在尝试对Bulk插入执行异步操作,但是没有插入任何数据,也没有给我错误.如何捕获异常?
I am now trying to do a async for Bulk insert, but there is neither any data inserted nor giving me error. How to capture the exception?
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.Run
在此处未添加任何有用的内容.另外,不要尝试在方法的两次运行之间共享单个连接 object .像这样:
The Task.Run
s are adding nothing useful here. Also, don't try to share a single connection object between the two runs of your method. Something like:
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
语句直到大容量加载完成后才关闭您的连接.完成.
Normally return await
is an anti-pattern, but here you want to use it so that the using
statement doesn't close your connection until after the bulk load is complete.
此外,我转而使用 Task.WaitAll
实际上是等待,这比使用 Task.WhenAll
然后立即调用 Wait
在上面.
Also, I switched to using Task.WaitAll
which actually waits, which is more idiomatic than using Task.WhenAll
and then immediately calling Wait
on it.
这篇关于异步进行批量复制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!