我面临一个通过强制垃圾收集器解决的问题。
我的代码由一个主要功能和两个子功能组成,它们分别读写文件。 问题是,当我不调用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);
}