应用程序抛出OutofMemoryException

时间:2018-07-26 20:46:51

标签: c# sql out-of-memory task fileinfo

您好研究员, 当前在我们的一个客户系统中运行的应用程序遇到OutofMemoryException问题,并且该应用程序崩溃。发生此问题的时间可能是一两个星期一次。使用c#开发的应用程序用于生产线。机器几乎每20秒产生28个不同的CSV文件。该应用程序用于查找这些CSV文件并存档。因此,应用程序每秒查询并执行一次对数据库表(具有大量数据的表)的更新/选择。我通读了其他程序员的问题和解答,并据此分析了我的代码,但是由于缺乏经验,我发现代码中存在内存泄漏。我将在这里分享我的代码的某些部分,我相信这些部分可能会发生内存泄漏。如果您分享您的意见或想法,将不胜感激。

代码

public void execute() //This is called every second 
 { 
    if (!this.busyBit) 
    {
        this.busyBit = true;
        CallAsyncFunction();
    }
  }
 protected async virtual void CallAsyncFunction()
 {
     await Task.Factory.StartNew(this.FileOperations); //is this correctly done?
 }
 protected virtual void FileOperations()
 {

   ////Searches for a new csv file
    if (!this. SearchTimestampInsideFileWithOddCounter())
    {
      //return error
    }

    if (!this.ArchiveFile())
    {
      //Archive the file
    }
      this.busyBit = false;
  }
 private bool SearchTimestampInsideFileWithOddCounter()
 {
     var directory = new DirectoryInfo(this.fileSearchPath);
    //Can the below code be a reason? because when I increased 
  //'numberOfFiles' to a huge number, the exception occured more frequently.
     FileInfo[] files = directory.EnumerateFiles().Where(f => 
     f.Extension.Equals(".csv", StringComparison.InvariantCultureIgnoreCase) 
    && f.Attributes != FileAttributes.Archive)                                       
   .OrderByDescending(fi => 
    fi.LastWriteTime).Take(this.numberOfFiles).ToArray();
   foreach (var file in files)
   {
         //Search for the required files from the list
         return true;

   }
   catch (Exception ex)
   {

   }
        return false;
 }

1 个答案:

答案 0 :(得分:0)

我认为答案可能是

  

应用程序每秒查询并对数据库表(该表具有大量数据)进行更新/选择。

应用程序是否一直在运行,还是仅在n秒内运行?如果它始终处于应用程序状态,则 if 如果未正确处理数据库对象,则内存占用量将在每个周期增加。