iClosable 接口 (windows.foundation.h)
定义一个用于发布所分配资源的方法。
继承
IClosable 接口继承自 IInspectable 接口。 IClosable 还具有以下类型的成员:
方法
IClosable 接口具有以下方法。
IClosable::Close 执行与释放、释放或重置分配的资源关联的应用程序定义任务。 |
注解
使用 IClosable 接口可管理Windows 运行时 对象使用的系统资源(如文件句柄和网络套接字)的生存期。
某些系统资源由一段代码独占使用,必须释放这些资源,然后其他代码才能使用它们。 例如,打开文件进行读/写访问会阻止其他代码打开同一个文件进行读/写访问,因此打开该文件的代码必须关闭文件句柄,然后其他代码才能打开该文件。
其他系统资源不是独占用途。 许多硬件设备(如传感器、地理位置、短信和便携式设备)可以在同一应用中或由多个应用多次打开。
IClosable 接口支持管理独占使用系统资源。 对 Windows 运行时 对象调用 Close 方法时,该对象会释放其系统资源,以便其他代码可以使用它们。 仅使用共享系统资源(如内存和可共享设备)的对象不实现 IClosable。
在 Windows 运行时 对象中实现 Close 方法时,代码必须释放它保留的所有独占使用资源。 如果对象引用了其他可关闭Windows 运行时对象,则必须在释放对象之前对这些对象调用 Close。 此外,代码必须释放其他资源,例如对其他Windows 运行时和组件对象模型的引用 (COM) 对象,以及内存缓冲区等非独占系统资源。
对对象调用 Close 方法会将对象保留在内存中,但该对象不再具有正常运行所需的系统资源。 依赖于已发布系统资源的成员必须返回 RO_E_CLOSED ,以指示对象已关闭且这些成员不再工作。
调用 Close 后,由 IUnknown 和 IInspectable 接口定义的方法必须继续正常运行。
对已关闭的对象调用 Close 不起作用,并返回 S_OK。
通常,对象通过在调用 Close 时设置布尔标志,或通过检查保留的资源是否为 null 或其他 sentinel 值来跟踪其关闭状态。
对象不需要同步对 Close 方法的访问。 这意味着可能存在争用条件,其中一个线程在对象上调用 Close ,而另一个线程正在使用对象。 在这种情况下,可能会收到 除RO_E_CLOSED以外的错误,但必须确保对象不会导致访问冲突。
在等待异步操作完成时 ,Close 方法不会阻止。 因此, 当 Close 方法返回时,基础系统资源可能不会完全释放。 为了确保确定性关闭,调用方必须等待所有异步操作完成或取消。 面对未完成的异步操作,对象必须尽快完成其系统资源的释放,但在等待这些操作完成时不得阻止。
如果可关闭Windows 运行时对象向其他对象公开独占使用资源,则必须提供一种方法来影响它持有的任何可关闭对象的所有权语义。 例如, DataReader 类提供 DetachStream 方法,该方法返回创建时收到的 IInputStream 。 调用 DetachStream 时,DataReader 不再是 IInputStream 的所有者,因此 DataReader 不会在 IInputStream 上调用 Close。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 8 |
最低受支持的服务器 | Windows Server 2012 |
目标平台 | Windows |
标头 | windows.foundation.h |