AsNoTracking 卡在等待手柄上

问题描述 投票:0回答:0

我一直在努力提高我的项目速度,并找到了原因。

这里是调用服务端方法的代码

List<Product> lstProduct = new List<Product>();

Task.Run(async () =>
{
    lstProduct = await Server.GetInstance().GetProductsList();
}).Wait();

哪个电话

public async Task<List<Product>> GetProductsList()
{
    List<Product> products = null;

    if (await CheckConnection())
    {
        products = await _managementHub.Invoke<List<Product>>("GetProductsList");
    }               

    return products;
}

这是当前代码。开始需要时间了。我猜这是因为产品的结构由于数据库的结构而包含多个 ICollection,使用引用产品的外键。

使用分离

public List<Product> GetProductsList()
{
    List<Product> products = null;

    using (var db = new Entities())
    {
        try
        {           
            products = db   .Products
                            .Where(x => x.IsDeprecated != 1)
                            .ToList();
            
            products.ForEach(x => db.Entry(x).State = EntityState.Detached);
            
        }
        catch (Exception e)
        {
            logger.Error(Tools.Logging.GetException(e));
        }

        return products;
    }
}

这种方式在更改状态时需要5秒才能完成将近600个Products。

据我所知,AsNoTracking 应该做同样的工作,所以我试了一下。这是以防万一的参考代码。

使用 AsNoTracking

public List<Product> GetProductsList()
{
    List<Product> products = null;

    using (var db = new Entities())
    {
        try
        {
            db.Configuration.AutoDetectChangesEnabled = false;

            products = db   .Products
                            .AsNoTracking()
                            .Where(x => x.IsDeprecated != 1)
                            .ToList();  
            
        }
        catch (Exception e)
        {
            logger.Error(Tools.Logging.GetException(e));
        }

        return products;
    }
}

这种方式要快得多,但它永远不会返回,按下“全部中断”似乎会导致 waithandle.cs(猜测 VSStudio 打开一个未找到源窗口)

c# entity-framework detach waithandle
© www.soinside.com 2019 - 2024. All rights reserved.