复制内存时检测到 StringTemplate 可能 I/O 竞争条件

StringTemplate Probable I/O race condition detected while copying memory

嗨,

在我的项目中,我使用 Antlr.StringTemplate.StringTemplateGroup class 来创建本地化模板。我访问 .st 文件并设置所需的属性如下。

public StringTemplate WrapValuesReportTemplateContent(   
   private StringTemplateGroup StringTemplateGroup = new StringTemplateGroup(StringTemplateGroupName);     

   StringTemplate stringTemplate = this.StringTemplateGroup.GetInstanceOf(path);

   stringTemplate.SetAttribute("atr1", value1);
   stringTemplate.SetAttribute("atr2", value2);

   return stringTemplate
)

经理重复使用 class,因此触发了以下异常。

    System.IndexOutOfRangeException: Probable I/O race condition detected while copying memory. The I/O package is not thread safe by default. In multithread applications, a stream must be accessed in a thread-safe way, such as a thread-safe wrapper returned by TextReader's or TextWriter's Synchronized methods. This also applies to classes like StreamWriter and StreamReader.
   at System.Buffer.InternalBlockCopy(Array src, Int32 srcOffsetBytes, Array dst, Int32 dstOffsetBytes, Int32 byteCount)
   at System.IO.StreamWriter.Write(Char[] buffer, Int32 index, Int32 count)
   at System.IO.TextWriter.WriteLine(String value)
   at System.IO.TextWriter.SyncTextWriter.WriteLine(String value)
   at Antlr.StringTemplate.ConsoleErrorListener.Error(String s, Exception e)
   at Antlr.StringTemplate.StringTemplate.BreakTemplateIntoChunks()

我是 StringTemplate 的新手,我不清楚 StringTemplates 的真正工作原理。从错误描述中我了解到 .st 资源未关闭。我有以下问题:

  1. 当创建一个新的 StringTemplate 时,我们创建一个 Stream 用于写入和读取 .st 文件,或者一个我们修改属性的新对象
  2. 打开 .st 文件后,它是否会在超出范围后自动关闭
  3. 避免此错误的最佳方法是什么。我们应该在资源上使用锁,或者将所有内容包装在 using?

任何澄清都会非常有用。 谢谢

您可以尝试同步对 stringTemplate 对象的访问。

我的猜测是,只有在同时修改和读取或修改它时才需要同步。如果你只是阅读它,通常并不重要。

    lock (stringTemplate)
    {
        // Access thread-sensitive resources.
    }

出于效率原因,您应该使同步块尽可能小;仅通过 stringTemplate 访问。

我最近遇到了同样的错误! 查看您的堆栈跟踪:它是从 ConsoleErrorListener 抛出的。 简而言之,抛出异常是因为两个线程正在尝试写入 Console.Out 流。 要消除此错误,您应该覆盖模板的错误处理程序。

标记为答案的解决方案可以使用,但锁争用过多。