C# 在注册表项上使用yield-return模式安全吗
在我的公司,我看到一些代码在Windows注册表中搜索一些键并返回IEnumerable,其中T是一个对象,它保存与查找模式匹配的注册表键的值和数据。进行此处理的方法使用收益率返回模式。包含收益返回的foreach完成后,注册表项关闭 我的问题是,访问Windows注册表是否安全?由于在迭代完成之前密钥不会关闭,因此,考虑到迭代完成之前可能存在任意延迟,如果出现电源故障/系统崩溃,会产生什么影响C# 在注册表项上使用yield-return模式安全吗,c#,iterator,registry,C#,Iterator,Registry,在我的公司,我看到一些代码在Windows注册表中搜索一些键并返回IEnumerable,其中T是一个对象,它保存与查找模式匹配的注册表键的值和数据。进行此处理的方法使用收益率返回模式。包含收益返回的foreach完成后,注册表项关闭 我的问题是,访问Windows注册表是否安全?由于在迭代完成之前密钥不会关闭,因此,考虑到迭代完成之前可能存在任意延迟,如果出现电源故障/系统崩溃,会产生什么影响 我还可能提到,在任何时候,返回的元素数量都是很少的,比如最多20个。保持注册表项打开以供读取,将主要
我还可能提到,在任何时候,返回的元素数量都是很少的,比如最多20个。保持注册表项打开以供读取,将主要占用操作系统资源。。。因此
正如peter在评论中提到的,不要将任何一次性对象包装在using语句中。如果您将注册表句柄长时间打开,会出现什么问题?如果您没有使用
屈服返回
您将如何处理钥匙以及把手打开的时间。我不相信会有任何问题。但是,我会使用语句确保您打开的项位于语句中,以确保在发生异常时将其处理。@Peter,注册表项中的数据将复制到域对象中并返回给调用方。一次遍历所有必需的键,用域对象填充一个本地(类)集合,关闭键并返回创建的集合,这样会更好吗?我真的认为不会有太大区别。如果您使用foreach的yield-return处理方法的结果,那么资源将不会被使用更长的时间。对对象使用linq之类的东西更有意义。将数据复制到s集合,然后继续进行该集合会占用内存,但没有任何实际好处--您没有显示任何会导致s的收益率问题的内容。