因此,我有一个 foreach (在另一个任务中运行,但这并不重要),它遍历几百万条记录并对其进行处理。当我想取消任务(使用取消令牌)并引发异常时,看起来该异常在几分钟内无法从前者中“爆发” >(我的想法是,查询运行时可能无法)。
这是示例代码:
var query = GetNrrSelectQuery(_dbContext);
try
{
StartShift();
foreach (var item in query.Select(x => new Something(x, _anonymizer)))
{
if (token.IsCancellationRequested)
{
_dbContext.Dispose();
return;
//token.ThrowIfCancellationRequested();
}
while (workArea.Jobs.Count > workArea.JobsQueueSize)
{
Thread.Sleep(100);
}
workArea.Jobs.Enqueue(new Job
{
ReportToImport = item
});
}
}
catch (Exception e)
{
WorkArea.ImportingState = ProcessState.CRASHED;
}
由于我使用的是主工人模式,所以整个代码没有有趣的部分。正如您在if (token.IsCancellationRequested)
语句中看到的那样,我已经尝试过想尽一切办法,但是它并不是真的想要工作(无论是否设置dbContext,抛出异常或仅返回)。
如果仅通过调用token.ThrowIfCancellationRequested();
引发异常,则调试器将在该特定行停止。击中F11(内部调试步骤)后几分钟实际上什么都没有发生,这是因为它脱离了foreach,而try-catch
块抓住了它。
有什么建议可以阻止整个查询过程吗?
还是我在寻找完全错误的方向?