C# 在注册表项上使用yield-return模式安全吗

C# 在注册表项上使用yield-return模式安全吗,c#,iterator,registry,C#,Iterator,Registry,在我的公司,我看到一些代码在Windows注册表中搜索一些键并返回IEnumerable,其中T是一个对象,它保存与查找模式匹配的注册表键的值和数据。进行此处理的方法使用收益率返回模式。包含收益返回的foreach完成后,注册表项关闭 我的问题是,访问Windows注册表是否安全?由于在迭代完成之前密钥不会关闭,因此,考虑到迭代完成之前可能存在任意延迟,如果出现电源故障/系统崩溃,会产生什么影响 我还可能提到,在任何时候,返回的元素数量都是很少的,比如最多20个。保持注册表项打开以供读取,将主要

在我的公司,我看到一些代码在Windows注册表中搜索一些键并返回IEnumerable,其中T是一个对象,它保存与查找模式匹配的注册表键的值和数据。进行此处理的方法使用收益率返回模式。包含收益返回的foreach完成后,注册表项关闭

我的问题是,访问Windows注册表是否安全?由于在迭代完成之前密钥不会关闭,因此,考虑到迭代完成之前可能存在任意延迟,如果出现电源故障/系统崩溃,会产生什么影响


我还可能提到,在任何时候,返回的元素数量都是很少的,比如最多20个。

保持注册表项打开以供读取,将主要占用操作系统资源。。。因此

  • 如果出现电源故障或系统崩溃,我认为您无需担心此代码。。操作系统本身消失了,任何进程所拥有的所有资源(如句柄)都消失了(这里有操作系统的智能持久性)

  • 另一方面,总是认为尽快释放任何操作系统资源是一种好的做法。。。如果列表很小,我会立即读取它,然后从内存中的列表返回值。。因为根据使用此API的代码以及使用方式,理论上它很容易被调用方滥用

  • 我想说,就你而言,这是一个很好的呼吁和尽职调查,至少考虑让系统资源占用超过必要时间的影响


    正如peter在评论中提到的,不要将任何一次性对象包装在using语句中。

    如果您将注册表句柄长时间打开,会出现什么问题?如果您没有使用
    屈服返回
    您将如何处理钥匙以及把手打开的时间。我不相信会有任何问题。但是,我会使用语句确保您打开的项位于
    语句中,以确保在发生异常时将其处理。@Peter,注册表项中的数据将复制到域对象中并返回给调用方。一次遍历所有必需的键,用域对象填充一个本地(类)集合,关闭键并返回创建的集合,这样会更好吗?我真的认为不会有太大区别。如果您使用foreach的yield-return处理方法的结果,那么资源将不会被使用更长的时间。对对象使用linq之类的东西更有意义。将数据复制到s集合,然后继续进行该集合会占用内存,但没有任何实际好处--您没有显示任何会导致s的收益率问题的内容。