繁体   English   中英

如何提高代码性能? 多线程或C#中的任务?

[英]How to increase code performance? multithread or Tasks in C#?

我有以下两个功能

   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 InsertDATA(List<ResultObject> Results){
foreach(var R in Results){
      .....
    //Insert Object to 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());
}

当然,您也需要将ParseData方法的签名更改为异步。
更改签名后, async/await开始以僵尸的形式散布在您的应用程序中:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM