C# 使用ResxResourceReader避免ArgumentException

C# 使用ResxResourceReader避免ArgumentException,c#,argumentexception,reader,C#,Argumentexception,Reader,我有一个ResxResourceReader异常 我知道文件存在,但是我不知道文件的内容是否合适(它有一个.resx扩展名,但内容可能是垃圾,或者根本没有内容) 问题是如何在不枚举的情况下检查它是否是正确的资源文件?因为使用reader.GetEnumerator()枚举它会引发异常 我已经查看了阅读器的属性,但没有看到任何允许我这样做的内容 我可以尝试捕获异常,但如果可能的话,我希望避免这种情况。 有什么建议吗 [EDIT]我想避免尝试捕获,特别是因为在捕获时,我将对另一个resx文件执行相同

我有一个ResxResourceReader异常

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

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

我已经查看了阅读器的属性,但没有看到任何允许我这样做的内容

我可以尝试捕获异常,但如果可能的话,我希望避免这种情况。

有什么建议吗


[EDIT]我想避免尝试捕获,特别是因为在捕获时,我将对另一个resx文件执行相同的操作,如果这也是无效的。。。你明白我的意思了。尽管这种情况很少发生

这不是对这个问题的100%回答,但会说明你所要求的方法的原因

如果您担心性能,那么使用缓存的ResourceManager(保存一个静态实例)是有充分理由的,它可以尝试在后台异步(每1分钟左右)刷新自己,而不绑定到每个请求。如果失败,它将每分钟失败一次。如果没有失败,所有工作线程都将能够访问新资源

当然,如果业务规则允许的话。 在CATCH中,您可以只使用“回退缓存实例”,因此不会发生第二次读取操作

异步执行繁重操作的想法是一种方法,在为高负载/低资源设计应用程序时,要牢记这一点——尽量保持“主循环”干净

除此之外,这取决于你想检查什么。当然,您可以用不同的方式检查文件内容,但是读取物理文件(两次)的IO成本可能比实际的TRY/CATCH更昂贵。
TRY/CATCH不是免费的,但它们是有原因的,有时你无法避免它们。它们是一个安全网,因此整个应用程序将继续运行。

有什么好的理由不尝试/捕获吗?您可以先(手动,不使用
XmlReader
;即使是
@Amit的原始检查也有相当多的争议。在我的应用程序中,性能是至关重要的,可能有数百万次并发调用。因此,即使每次使用应用程序都会捕获一次异常,如果应用程序被调用数百万次,那么异常也会发生被捕获数百万次,这涉及到一个重要的性能块。resx文件是垃圾的可能性有多大?1/100?是用户输入的吗?我同意,但完整的解析速度很慢(同样是因为你不能确定,除非你完全完成)。它不会使每一百万次,而是每一次调用都慢下来(因为它将执行两次:一次由您执行,另一次由ResxResourceReader执行-这可能比您快得多)。除非99.9%的时间您得到无效的resx…捕获异常的速度更快(但我会测量…)