使用任务 - C# 向 MySQL 插入 100.000 个条目
本文关键字:插入 MySQL 任务 | 更新日期: 2023-09-27 18:34:02
我的代码遇到了一些问题。我正在尝试使用任务在 Mysql 表中插入大约 100.000 个项目以加快该过程。这是我的代码:
List < Task > tasks = new List < Task > ();
int counter = 0;
foreach(var folder in dirs) {
object lockTarget = new object();
tasks.Add(Task.Factory.StartNew(() => {
try {
comm.CommandText = "INSERT INTO webdata(url,title) VALUES(?sUrl,?sTitle,) ON DUPLICATE KEY UPDATE url=?sUrl,title=?sTitle";
comm.Parameters.Add("?sUrl", MySql.Data.MySqlClient.MySqlDbType.VarChar).Value = url;
comm.Parameters.Add("?sTitle", MySql.Data.MySqlClient.MySqlDbType.VarChar).Value = title;
var mysql_return = comm.ExecuteNonQueryAsync();
lock(lockTarget) {
counter++;
Console.WriteLine("'rProcessing {0} of {1} - {2} {3}", counter, dirs.Length, folder, mysql_return.Status);
}
} catch (MySql.Data.MySqlClient.MySqlException ex) {
Console.WriteLine(ex.Message);
}
}));
}
Task.Factory.StartNew(() => {
Task.WaitAll(tasks.ToArray());
Console.WriteLine("Finished");
conn.Close();
});
因此,当我运行代码时,一些任务(mysql_return)返回rantocompletion
,一些返回Faulted
,因此只有1/2的条目实际插入到数据库中。
我可以使用ExecuteNonQuery
而不使用Task
但是插入这么多数据需要很长时间。问题是由于硬件(CPU无法跟上数千个生成的任务)还是由于我的代码?
有什么想法吗?提前致谢
问题 1:comm
似乎在多个线程中被修改,那必须是局部变量。
问题 2:您不是在等待ExecuteNonQueryAsync
返回的任务,因此Task
返回的任务StartNew
不会等待ExecuteNonQueryAsync
完成。
最终,您关闭连接,假设所有操作都已完成,但它们尚未完成。它们都已启动,但尚未完成。
您需要使用 await ExecuteNonQueryAsync
的结果(用于 lambda async
),还需要调用 Task.UnWrap
或使用 Task.Run
免费为您提供UnWrap
。
因此,您的代码将变为如下所示:
tasks.Add(Task.Run(async () => //Note Task.Run and async lambda
{
try
{
var comm = new WhateverCommand();
...
var mysql_return = await comm.ExecuteNonQueryAsync();//Note the await
...
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
Console.WriteLine(ex.Message);
}
}));