asp.net – 线程安全和MEF目录
我正在使用MEF(.Net Framework中的那个,而不是System.Composition Nuget)在asp.net中进行DI.我遇到了许多先前由于MEF生根NonShared IDisposable而导致的内存泄漏(例如
link)
我正在寻找使用儿童容器来解决这个问题 >子容器创建特定于单个请求的(非共享)部件 所以类似于: CompositionContainer GetRequestContainer(CompositionContainer parent,ComposablePartCatalog catalog) { return new CompositionContainer(catalog,parent); } 最初,我使用共享和非共享部分构建了一个目录:要创建仅包含NonShared部分的子容器,我使用FilteredCatalogs构建了父CompositionContainer的目录,以便过滤的目录仅包含NonShared部分. 这解决了内存泄漏,因为我可以在请求结束时Dispose()子容器,然后释放我所有的NonShared IDisposable对象.大. 但是,调用childContainer.GetExportValues会返回重复项,因为父容器目录中有一些部分以及子容器的目录. 现在我想明确地创建2个目录: >所有共享部件的全局目录 我怀疑IDisposable跟踪是在容器级别所以我应该安全地传递每个目录的单个实例,但这是我想在这里问的并确认: 具有支持所有容器实例的目录的单个实例是否是线程安全的? 因此N个并发WebRequest实例由N 1个CompositionContainer实例(子父级)提供服务,所有实例都由2个全局编录实例支持. CompositionContainer parent = new CompositionContainer(Static.Global,CompositionOptions.IsThreadSafe); CompositionContainer GetRequestContainer(CompositionContainer parent) { return new CompositionContainer(Static.Local,parent); } 解决方法
使用具有多个CompositionContainer实例的相同目录实例是完全安全的(顺便说一下,无论您在创建容器时是否使用CompositionOptions.IsThreadSafe选项,都是如此).
这样做是安全的原因是因为目录仅定义了容器可以创建的部件的“潜在”,并且不保存关于它们是否已被实例化的任何数据.跟踪此类事物是容器的责任. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |