加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 线程安全和MEF目录

发布时间:2020-12-16 09:40:27 所属栏目:asp.Net 来源:网络整理
导读:我正在使用MEF(.Net Framework中的那个,而不是System.Composition Nuget)在asp.net中进行DI.我遇到了许多先前由于MEF生根NonShared IDisposable而导致的内存泄漏(例如 link) 我正在寻找使用儿童容器来解决这个问题 子容器创建特定于单个请求的(非共享)部件
我正在使用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个目录:

>所有共享部件的全局目录
>所有NonShared零件的本地目录

我怀疑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选项,都是如此).

这样做是安全的原因是因为目录仅定义了容器可以创建的部件的“潜在”,并且不保存关于它们是否已被实例化的任何数据.跟踪此类事物是容器的责任.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读