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)
该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它。
| 归档时间: |
|
| 查看次数: |
4447 次 |
| 最近记录: |