我知道在 EF6 中做了很多工作来支持 CountAsync 等异步操作,但我似乎无法取消简单的查询。这是故事。
我有一个返回 450 万行的查询。我需要处理每一行,但我无法将它们全部保存在内存中。EF6 好心让我这样做:
foreach (var row in context.TableX.AsNoTracking())
{
...process each row
}
这很好用并且使用很少的内存,但它不是很容易取消。我试过这种愚蠢的做法:
foreach (var row in context.TableX.AsNoTracking().ToListAsync(token).Result)
{
...process each row
}
当然,这会尝试将整个查询加载到 List<> 中,它在加载所有行之前很久就崩溃了。值得庆幸的是,它对取消非常敏感。:)
我得到的最接近的是像这样包装整个混乱:
Task.Run(() => DoQuery(), token);
这不会占用内存,我可以取消它,但是取消需要永远响应,并且有一些令人讨厌的例外,因为我正在拉出地毯。
我在这里想念什么?