我正在尝试对async
和await
使用异步编程来计算一些值,并使用ASP.NET Core 2.x定期将其保存在数据库中。下面显示的方法不在线程池中执行。
public async void CalculateCIndex(int CIndexId)
{
List<string> UserIds = _context.ApplicationUsers
.Where(m => m.EmailConfirmed == true)
.Select(m => m.Id).ToList();
for (int i = 0; i < UserIds.Count; i += 10)
{
var temp = UserIds.Skip(i).Take(10);
foreach (var Id in temp)
{
await Task.Run(async () =>
{
await CIndexCal(Id, CIndexId);
});
}
await Task.Delay(6000);
}
}
public async Task CIndexCal(string Id, int CIndexId)
{
_context.CIndexMember.Add(new CIndexMember
{
NCIndex = (decimal)((AindexAfterRar + Power) / CI.TotalCindex)
});
_context.SaveChanges();
}
答案 0 :(得分:0)
您可以在这里找到好的答案: async/await - when to return a Task vs void?
您的方法CIndexCal被声明为异步,但是由于您实际上未在其中使用异步方法,因此它根本不是异步的。为了更改此设置,您可以更改:
_context.SaveChanges();
到
await _context.SaveChangesAsync();
然后而不是:
await Task.Run(async () =>
{
await CIndexCal(Id, CIndexId);
});
您只需要:
await CIndexCal(Id, CIndexId);
我不确定您为什么要拖延时间,我认为您不需要这样做:
await Task.Delay(6000);