3

我知道在 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);

这不会占用内存,我可以取消它,但是取消需要永远响应,并且有一些令人讨厌的例外,因为我正在拉出地毯。

我在这里想念什么?

4

1 回答 1

2

你可以这样做:

public async Task DoQuery(CancellationToken token) {
    await ctx.TableX.AsNoTracking().ForEachAsync(row =>
    {
         // process here
    }, token);
}
于 2016-04-29T22:56:18.777 回答