【问题标题】:Avoiding ArgumentException with a ResxResourceReader使用 ResxResourceReader 避免 ArgumentException
【发布时间】:2015-06-12 08:37:56
【问题描述】:

我遇到了带有 ResxResourceReader 的 ArgumentException。

我知道该文件存在,但我不知道该文件的内容是否合适(它有 .resx 扩展名,但内容可能是垃圾或者根本就没有内容)。

问题是如何在不枚举的情况下检查它是否是正确的资源文件?由于使用reader.GetEnumerator() 枚举它会引发异常。

我查看了阅读器的属性,但没有看到任何可以让我这样做的东西。

我可以尝试一下并捕获异常,但如果可能的话我想避免这种情况。

有什么建议吗?

[EDIT] 我想特别避免 try-catch,因为在 catch 上我会用另一个 resx 文件执行 same 操作,如果那是无效的以及...好吧,你明白我的意思。虽然这应该很少发生。

【问题讨论】:

  • 有什么理由不去尝试/赶上吗?
  • 如果它是有效的 XML 文件,您可以首先(手动,不使用 XmlReader;即使使用 <?xml 进行原始检查也可能有效 - 小心编码)。它可能会减少它具有 resx 扩展的机会,但这不是您所期望的。我不会走得更远:如果它似乎 是一个 XML 文件并且它具有 .resx 扩展名,然后尝试打开它(并最终捕获异常)。在您完全解析它之前,您无法确定它是一个有效的 .resx(即使使用架构进行验证也是不够的,因为内容可能会损坏)。
  • @Amit 有很多争论。在我的应用程序中,性能是关键,可能有数百万个并发调用。因此,即使在每次使用应用程序时偶尔捕获一次异常,如果应用程序被调用数百万次,那么异常也会被捕获数百万次,这涉及到重要的性能块。 Relevant link
  • resx 文件是垃圾的可能性有多大? 1/100?是来自用户的输入吗?
  • 我同意,但是完整的解析是 slow (再次因为除非你完全完成,否则你无法确定)。它不会减慢每百万个,而是每一个调用(因为它会执行两次:一次由您完成,另一次由 ResxResourceReader 执行 - 这可能比您快得多)。除非 99.9% 的时候你得到一个无效的 resx...捕获异常更快(但我会衡量...)

标签: c# argumentexception reader


【解决方案1】:

这不是问题的 100% 答案,但会说明您所要求的方法的原因。

如果你关心性能,有一个很好的理由使用缓存的ResourceManager(持有一个静态实例),它可以尝试在后台异步刷新自己(每1分钟左右)并且不受约束每个请求。如果失败,它将每分钟失败一次。如果没有失败,所有工作线程都可以访问新资源。

这当然是在业务规则允许的情况下。 Should I use the static cached ResourceManager or a new instance for each web request? Does it matter? 在 CATCH 中,您可以只使用“回退缓存实例”,因此不会发生第二次读取操作。

在为重负载/低资源设计应用程序时,异步执行繁重操作的想法是可行的方法 - 尽量保持“主循环”尽可能干净。

除此之外,这取决于您要检查的内容。您当然可以用不同的方式检查文件内容,但是读取物理文件(两次)的 IO 成本将比实际的 TRY/CATCH 贵 waaaaaay。 Using Exceptions throwing in C#. Does it affect a performance? TRY/CATCH-es 不是免费的,但它们是有原因的,有时你无法避免它们。它们是一个安全网,因此整个应用程序可以继续运行。

【讨论】:

    猜你喜欢
    • 2012-04-18
    • 2014-10-17
    • 1970-01-01
    • 2022-11-15
    • 2023-01-15
    • 2019-01-15
    • 2017-11-07
    • 2017-09-12
    • 2015-08-21
    相关资源
    最近更新 更多