如何提高代码性能?C#中的多线程或任务?
我有以下两个功能如何提高代码性能?C#中的多线程或任务?,c#,.net,multithreading,task,C#,.net,Multithreading,Task,我有以下两个功能 void ParserData(List<DataObject> MyObjcets){ //loop over MyObjects List<ResultObject> Results = new List<ResultObject> (); foreach(var Obj in MyObjects){ //do some computation and add it
void ParserData(List<DataObject> MyObjcets){
//loop over MyObjects
List<ResultObject> Results = new List<ResultObject> ();
foreach(var Obj in MyObjects){
//do some computation and add it to an instance of ResultObject
ResultObject R = new ResultObject();
Results.Add(R);
if(Results.count >= 2000){
//call a function that will insert Results to MYSQL DB
InsertDATA(Results);
//create empty Results list
Results = new List<ResultObject> ();
}
//
}
void ParserData(列出myObjects){
//肌对象上的环
列表结果=新列表();
foreach(MyObject中的var Obj){
//执行一些计算并将其添加到ResultObject的实例中
ResultObject R=新的ResultObject();
结果:添加(R);
如果(Results.count>=2000){
//调用将结果插入MYSQL数据库的函数
插入数据(结果);
//创建空结果列表
结果=新列表();
}
//
}
插入函数
void InsertDATA(List<ResultObject> Results){
foreach(var R in Results){
.....
//Insert Object to MYSQLDB
}
}
void InsertDATA(列出结果){
foreach(结果中的var R){
.....
//将对象插入MYSQLDB
}
}
我想让这段代码更快,但我不确定最好的方法是什么。我之所以每2000年提交一次插入,是因为此后系统内存不足。
有没有一种方法,在我发送要插入的数据后,我可以在插入我发送的数据时继续执行更多的计算,而不必等到插入完成
如有任何加快此代码速度的建议,我们将不胜感激。根据您提供的信息,您可以使用
async/await
方法作为数据库方法
使数据库插入方法异步
Task SaveResultAsync(ResultObject result)
{
var query = "INSERT ...."
using (var conn = new MySqlConnection(connectionString))
using (var command = new MySqlCommand(conn, query)
{
// command.AddParameter for values you want to insert
await conn.OpenAsync();
await command.ExecuteNonQueryAsync();
}
}
然后,您可以自己运行每个查询,而无需等待其他查询和结果
async Task ParserData(List<DataObject> MyObjcets)
{
var tasks = new List<Task>();
foreach(var Obj in MyObjects)
{
//do some computation and add it to an instance of ResultObject
ResultObject result = new ResultObject();
var task = SaveResultAsync(result );
tasks.Add(task);
}
await Task.WhenAll(tasks.ToArray());
}
异步任务解析数据(列出myObjects)
{
var tasks=新列表();
foreach(MyObject中的var Obj)
{
//执行一些计算并将其添加到ResultObject的实例中
ResultObject结果=新的ResultObject();
var task=SaveResultAsync(结果);
任务。添加(任务);
}
等待Task.WhenAll(tasks.ToArray());
}
当然,您也需要将ParseData
方法的签名更改为异步。更改签名后,
async/await
开始以僵尸的形式在应用程序中传播:)基于您提供的信息-您可以对数据库方法使用async/await
方法
使数据库插入方法异步
Task SaveResultAsync(ResultObject result)
{
var query = "INSERT ...."
using (var conn = new MySqlConnection(connectionString))
using (var command = new MySqlCommand(conn, query)
{
// command.AddParameter for values you want to insert
await conn.OpenAsync();
await command.ExecuteNonQueryAsync();
}
}
然后,您可以自己运行每个查询,而无需等待其他查询和结果
async Task ParserData(List<DataObject> MyObjcets)
{
var tasks = new List<Task>();
foreach(var Obj in MyObjects)
{
//do some computation and add it to an instance of ResultObject
ResultObject result = new ResultObject();
var task = SaveResultAsync(result );
tasks.Add(task);
}
await Task.WhenAll(tasks.ToArray());
}
异步任务解析数据(列出myObjects)
{
var tasks=新列表();
foreach(MyObject中的var Obj)
{
//执行一些计算并将其添加到ResultObject的实例中
ResultObject结果=新的ResultObject();
var task=SaveResultAsync(结果);
任务。添加(任务);
}
等待Task.WhenAll(tasks.ToArray());
}
当然,您也需要将ParseData
方法的签名更改为异步。更改签名后,
async/await
开始以僵尸的形式在应用程序中传播:)最好的建议是在程序中使用探查器,看看它实际花费了多少时间。查看dotTrace
有30天的免费试用期。如果它如此琐碎,并且数据在同一个表中,您可能会过得更好如果使用批插入,最好的建议是在你的程序上使用一个分析器,看看它实际花费了多少时间。查看dotTrace
有一个30天的免费试用期。如果它如此简单,并且数据在同一个表中,你可能会更好地使用批插入。我会尝试一下,非常感谢。有一件事完成了,我不是t从SaveResult返回任何内容,但编译器正在抱怨返回语句。我是否需要SaveResult函数中的返回语句??异步方法始终返回Task
。如果方法返回一些值,它将是Task
,如果方法是void
(您的案例)它将返回Task
。其思想是异步方法返回包含任务状态信息的对象。仍然不确定如何返回任务。我应该在savereuslt函数末尾写些什么?检查SaveresultAsync
方法的更新答案。在这种情况下,您不需要返回任何内容。等待
关键字将发挥作用。如果您不想等待任务完成,可以返回任务
:返回命令。ExecuteOnQuery
。每个异步方法返回任务
等待关键字将“展开”任务返回值或无效。如果出现异常wait
将抛出异常,我将尝试此操作,非常感谢。一件事是,我没有从SaveResult返回任何内容,但编译器正在抱怨返回语句。我是否需要SaveResult函数中的返回语句??异步方法始终返回任务
。如果方法返回某个值,它将是任务
,如果方法是无效
(您的案例)它将返回Task
。其思想是异步方法返回包含任务状态信息的对象。仍然不确定如何返回任务。我应该在savereuslt函数末尾写些什么?检查SaveresultAsync
方法的更新答案。在这种情况下,您不需要返回任何内容。等待
关键字将发挥作用。如果您不想等待任务完成,可以返回任务
:返回命令。ExecuteOnQuery
。每个异步方法返回任务
等待关键字将“展开”任务返回值或无效。如果出现异常wait
将引发异常