我正在尝试使用 asp.net core 2.1 实现自托管 Web 服务,但遇到了实现后台长时间执行任务的问题。
由于每种ProcessSingle方法(在下面的代码片段中)的高 CPU 负载和时间消耗,我想限制同时执行的任务的数量。但是我可以看到所有任务Parallel.ForEach几乎立即开始,尽管我设置了MaxDegreeOfParallelism = 3
我的代码是(这是一个简化版本):
public static async Task<int> Work()
{
var id = await CreateIdInDB() // async create record in DB
// run background task, don't wait when it finishes
Task.Factory.StartNew(async () => {
Parallel.ForEach(
listOfData,
new ParallelOptions { CancellationToken = token, MaxDegreeOfParallelism = 3 },
async x => await ProcessSingle(x));
});
// return created id immediately
return id;
}
public static async Task ProcessSingle(MyInputData inputData)
{
var dbData = await GetDataFromDb(); // get data from DB async using Dapper
// some lasting processing (sync)
await SaveDataToDb(); // async save processed data to DB using Dapper
}
如果我理解正确,问题出async x => await ProcessSingle(x)在 Parallel.ForEach 内部,不是吗?
有人可以描述一下,它应该如何以正确的方式实施?
更新
由于我的问题存在某种歧义,因此有必要关注主要方面:
方法分为三部分ProcessSingle
:
从数据库异步获取数据
进行长时间高 CPU 负载的数学计算
将结果保存到数据库异步
问题包括两个独立的:
如何降低 CPU 使用率(例如同时运行不超过三个数学计算)?
如何保持ProcessSingle
方法的结构 - 由于异步 DB 调用而使它们保持异步。
希望现在会更清楚。
PS 已经给出了合适的答案,它可以工作(特别感谢@MatrixTai)。编写此更新是为了进行一般说明。
慕森卡
牛魔王的故事
相关分类