【问题标题】:Disposing DataServiceContext?处理 DataServiceContext?
【发布时间】:2016-02-18 15:14:54
【问题描述】:

我创建了一个应用程序,它读取CSV 文件,创建一个DataServiceContext 并将数据大量插入我的远程OData API 服务器。

然而,在运行30,000 记录导入 5 分钟后,我发现应用程序仍在使用 750MB 内存!

我应该做些什么来减少内存使用?或者至少让它更早地收集垃圾?它似乎没有实现IDisposable,而且我的 google-fu 让我失望了。谢谢。

【问题讨论】:

    标签: c# odata wcf-data-services


    【解决方案1】:

    我遇到了与 Microsoft.OData.Client.DataServiceContext 类类似的问题,该类看起来类似于 System.Data.Services.Client.DataServiceContext。

    发生的事情是 DataServiceContext 有一个 EntityTracker,用于跟踪对被迭代的实体所做的任何更改。环顾四周后,我看到 DataServiceContext 有一个 MergeOption 属性。要解决您的问题,请将其设置为 NoTracking,如下所示:

    dsc.MergeOption = MergeOption.NoTracking;
    

    这应该在开始枚举之前完成一次,无论是在构造函数中还是在循环之前的任何地方。

    【讨论】:

    • 但是如果你这样做,你将无法使用 LoadProperty 方法而不抛出异常
    【解决方案2】:

    如果对任何人有帮助,我在处理后一直在使用它来清除上下文。

    public static void ClearChanges(this DataServiceContext context)
    {
        foreach (var entity in context.Entities.ToList())
        {
            context.Detach(entity.Entity);
        }
    
        foreach (var link in context.Links.ToList())
        {
            context.DetachLink(link.Source, link.SourceProperty, link.Target);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多