WCF私有内存使用通过查询增加查询

时间:2011-09-15 11:59:35

标签: c# asp.net wcf iis memory-leaks

我有一个WCF服务,它有一个名为GetLineBusses的简单方法。

public MobileResponse GetLineBusses(MobileRequest Request)
    {
        MobileResponse response = new MobileResponse();
        using (var entities = new NerdeBuOtobusEntities())
        {


            Line line = null;
            List<Point> points = new List<Point>();
            City city = entities.Cities.SingleOrDefault(t => t.ID == Request.CityID);
            try
            {
                line = entities.Lines.SingleOrDefault(t => t.ID == Request.LineID);
                //if (line != null)
                //{
                //    points = entities.Points.ToList().Where(t => t.LineID == Request.LineID && Request.WithPoints == true).ToList();
                //}
            }
            catch (System.Exception ex)
            {

            }
            FetcherManager fetcherManager = new FetcherManager(city);
            List<Bus> busses = fetcherManager.GetLineBusses(line);

            List<BusDTO> busDtos = new List<BusDTO>();

            foreach (Bus bus in busses)
            {
                BusDTO aBus = new BusDTO(bus);
                busDtos.Add(aBus);
            }
            response.Points = points.Select(t => new PointDTO(t)).ToList();
            response.Busses = busDtos;
        }

        return response;
    }

我观察到的是,当我发布上述方法时,每个查询方法都会增加我的IIS工作进程ram使用高达160,000 kb。为了找出问题,我注释掉了

City city = entities.Cities.SingleOrDefault(t => t.ID == Request.CityID);

line = entities.Lines.SingleOrDefault(t => t.ID == Request.LineID);

现在,方法的ram使用最小化为20,000。我认为问题是因为实体框架尤其是LINQ。顺便说一句,我已经尝试过静态查询以减少内存使用但它根本不起作用。我怎么解决这个问题?我想通过使用LINQ来最小化ram的使用...

此致

末尔

2 个答案:

答案 0 :(得分:0)

看起来Entity Framework在每次方法调用时都会从表中加载所有数据。 检查实体框架的版本。 4.0以上的版本以纯粹的性能着称。 还尝试指定一些选择查询以减少数据量。

答案 1 :(得分:0)

以下行是在entities.Points上调用ToList()。这会导致整个Points表被加载到DataContext中,然后应用Where()子句。

points = entities.Points.ToList().Where(t => t.LineID == Request.LineID && Request.WithPoints == true).ToList(); 

尝试在entities.Points之后删除ToList()。例如,

points = entities.Points.Where(t => t.LineID == Request.LineID && Request.WithPoints == true).ToList();