我一直在努力提高我的项目速度,并找到了原因。
这里是调用服务端方法的代码
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 打开一个未找到源窗口)