gpt4 book ai didi

c# - 异步批量复制

转载 作者:行者123 更新时间:2023-12-03 19:33:21 25 4
gpt4 key购买 nike

我有相当多的数据表要批量插入到数据库表中由于其尺寸较大,一张表需要 5 分钟才能完成插入。 2 table 花了我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, insert2);
}

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 在这里没有添加任何有用的内容。另外,不要尝试在方法的两次运行之间共享单个连接对象。像这样的东西:

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 wait 是一种反模式,但在这里您希望使用它,以便 using 语句在批量加载完成之前不会关闭您的连接完成。

此外,我改用 Task.WaitAll实际上等待,这比使用Task.WhenAll然后立即调用Wait更惯用。

关于c# - 异步批量复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38759458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com