如何提高代码性能?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
将引发异常