读/写文件后调用垃圾收集器

时间:2019-03-04 19:01:03

标签: .net-core

我面临一个通过强制垃圾收集器解决的问题。

我的代码由一个主要功能和两个子功能组成,它们分别读写文件。 问题是,当我不调用GC.Collect()时,发生异常,告诉我在发生写入或第二次读取时“文件被另一个进程使用”。 我试图使用流Writer / Reader到using中,强制关闭流,强制进行dispose等...,但是我发现使它正常工作的唯一方法是调用de垃圾收集器。 我在stackOverflow上看到了很多帖子,其中说调用carbage collector是一种不好的做法,并且该问题可能是由于代码错误造成的。 那你能告诉我怎么了吗?

主要功能:(//做一些事情意味着有隐藏的代码):

    private async Task<string> ReadFileAsync(string path)
    {
        string strText = null;
        int nb_try = 0;

        while (strText == null && nb_try < 20)
        {
            try
            {
                strText = await File.ReadAllTextAsync(path);
                // Open the text file using a stream reader.
            }
            catch (IOException e)
            {
                _logger.LogError(e.Message);
                GC.Collect();
            }
            if (strText == null)
            {
                await Task.Delay(10);
            }
            nb_try++;
        }
        GC.Collect();
        return strText;
    }

阅读功能:

    private async Task SerializeCalendar(Ical.Net.Calendar calendar, string path)
    {
        var serializer = new CalendarSerializer();
        var serializedCalendar = serializer.SerializeToString(calendar);
        bool success = false;
        int nb_try = 0;
        while (success == false && nb_try < 20)
        {
            try
            {
                await File.WriteAllTextAsync(path, serializedCalendar);
                /*using (StreamWriter outputFile = new StreamWriter(path))
                {
                    await outputFile.WriteAsync(serializedCalendar);
                }*/
                success = true;
            }
            catch (IOException e)
            {
                success = false;
                _logger.LogError(e.Message);
                GC.Collect();
                await Task.Delay(10);
            }
            nb_try++;
        }
        GC.Collect();
    } 

书写功能:

/**
  *  @Route("/documents/{slug}", name="documents", methods={"GET","POST"})
  *  @ParamConverter("page", options={"mapping": {"slug": "slug"}})
  */
 public function documents(Page $page,  Request $request)
  {
     $foo = $repo->doSomethingDifferentWithEntities($page)

     $bar = $this->transformer->transform($foo);
  }

0 个答案:

没有答案