使用ASP.NET Core与异步进行异步编程并等待

时间:2020-09-28 09:48:39

标签: c# asp.net-core asynchronous scheduled-tasks

我正在尝试对asyncawait使用异步编程来计算一些值,并使用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();
}

1 个答案:

答案 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);