首页 > 解决方案 > 使用 ASP.NET Core 使用 async 和 await 进行异步编程

问题描述

我正在尝试使用异步编程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();
}

标签: c#asp.net-coreasynchronousscheduled-tasks

解决方案


你可以在这里找到好的答案: 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);

推荐阅读