【问题标题】:How to increase code performance? multithread or Tasks in C#?如何提高代码性能? C# 中的多线程或任务?
【发布时间】:2016-11-25 17:13:42
【问题描述】:

我有以下两个功能

   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 年提交一次插入的原因是因为在那之后系统内存不足。 有没有办法在我发送要插入的数据后,我可以在插入我发送的数据时继续做更多的计算,而不是等到插入完成?

任何使此代码更快的建议将不胜感激。

【问题讨论】:

  • 最好的建议是在你的程序上使用分析器,看看它实际花费的时间。
  • 查看 dotTrace jetbrains.com/profiler 有 30 天免费试用期
  • 如果它很简单并且数据在同一个表中,你最好使用批量插入

标签: c# .net multithreading task


【解决方案1】:

根据您提供的信息 - 您可以使用 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 开始像僵尸一样在您的应用程序中传播:)

【讨论】:

  • 我会试试这个,非常感谢。通过一件事,我没有从 SaveResult 返回任何内容,但编译器抱怨 return 语句。 SaveResult 函数中是否需要 return 语句??
  • 异步方法总是返回Task。如果方法返回一些值,它将是Task&lt;string&gt;,如果方法是void(您的情况),它将返回Task。这个想法是异步方法返回对象,其中包含有关任务状态的信息。
  • 仍然不确定如何返回任务。 savereuslt函数最后应该写什么?
  • 检查SaveresultAsync 方法的更新答案。在这种情况下,您不需要返回任何东西。 await 关键字会变魔术。如果您不想等待任务完成,您可以返回Task:return command.ExecuteNonQuery。每个异步方法都返回Taskawait 关键字会将任务“解包”为返回值或 void。如果出现异常await会抛出异常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多