C# 如何使用async in void方法

C# 如何使用async in void方法,c#,asp.net-core,async-await,hangfire,C#,Asp.net Core,Async Await,Hangfire,我正在开发Asp.Net核心MVC Web应用程序,在这个应用程序中,我必须检查是否有任何用户的“EndOfSubscription”每天都在结束。我必须将所有用户设置为“过期”,然后向该用户发送电子邮件 整个过程应作为后台任务执行。现在,它每天都能成功工作,并将用户设置为“过期”罚款。但我的问题是如何在设置用户为“过期”后立即发送电子邮件。因为我必须使用(等待)发送电子邮件,但我知道使用(等待)无效方法是一种不好的做法。我尝试使用扩展方法,但并没有达到预期效果 这是我的启动文件 pub

我正在开发Asp.Net核心MVC Web应用程序,在这个应用程序中,我必须检查是否有任何用户的“EndOfSubscription”每天都在结束。我必须将所有用户设置为“过期”,然后向该用户发送电子邮件

整个过程应作为后台任务执行。现在,它每天都能成功工作,并将用户设置为“过期”罚款。但我的问题是如何在设置用户为“过期”后立即发送电子邮件。因为我必须使用(等待)发送电子邮件,但我知道使用(等待)无效方法是一种不好的做法。我尝试使用扩展方法,但并没有达到预期效果

这是我的启动文件

    public void ConfigureServices(IServiceCollection services)
    {
       ---------- Lines of Code ----------
        services.AddSingleton<IEmailSender, EmailSender>();
        services.Configure<EmailOptions>(Configuration);
        services.AddHangfire(config => config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));
        services.AddHangfireServer();
        services.AddScoped<IExpirationJob, ExpirationJob>();
    }

    public void Configure(IApplicationBuilder app,
        IWebHostEnvironment env,
        IRecurringJobManager recurringJobManager,
        IServiceProvider serviceProvider)
    {
         ---------- Lines of Code ----------
        app.UseHangfireDashboard();
        //app.UseHangfireDashboard("/hangfire", new DashboardOptions()
        //{
        //    Authorization = new[] { new CustomAuthorizeFilter() }
        //});
        app.UseAuthentication();
        app.UseAuthorization();

        recurringJobManager.AddOrUpdate(
           "End Users Subscription",
           () => serviceProvider.GetService<IExpirationJob>().SetExpired(),
           Cron.Minutely
           );
    }
}
public void配置服务(IServiceCollection服务)
{
----------代码行----------
services.AddSingleton();
服务。配置(配置);
services.AddHangfire(config=>config.UseSqlServerStorage(Configuration.GetConnectionString(“DefaultConnection”));
services.AddHangfireServer();
services.addScope();
}
公共无效配置(IApplicationBuilder应用程序,
IWebHostenvironmentEnv,
Irecurring JobManager Recurring JobManager,
IServiceProvider服务提供商)
{
----------代码行----------
app.UseHangfireDashboard();
//app.UseHangfireDashboard(“/hangfire”,新仪表板选项()
//{
//Authorization=new[]{new customauthorizationfilter()}
//});
app.UseAuthentication();
app.UseAuthorization();
recurringJobManager.AddOrUpdate(
“最终用户订阅”,
()=>serviceProvider.GetService().SetExpired(),
克朗,分钟
);
}
}
}

这是ExpiredUsersServices文件

 public interface IExpirationJob
{
    void SetExpired();
}


public class ExpirationJob : IExpirationJob
{
    private readonly ApplicationDbContext _db;
    private readonly IEmailSender _emailSender;

    public ExpirationJob(ApplicationDbContext db, IEmailSender emailSender)
    {
        _db = db;
        _emailSender = emailSender;
    }

    public void SetExpired()
    {
        foreach(var item in _db.Institution)
        {
            if (item.EndOfSubscriptionDate <= DateTime.Today) 
            {
                item.Status = SD.StatusExpired;

              //await _emailSender.SendEmailAsync( item.Admin.Email, "Your Account is Expired !", "Your subscription is over and your account is expired."); 
            }
        }
       await _db.SaveChangesAsync();
    }
}
公共接口IExpirationJob
{
void SetExpired();
}
公共类过期作业:IExpirationJob
{
私有只读应用程序dbContext_db;
私人只读IEmailSender\u emailSender;
公共过期作业(ApplicationDbContext数据库,IEmailSender)
{
_db=db;
_emailSender=emailSender;
}
公共无效设置过期()
{
foreach(银行机构中的var项目)
{

如果(item.EndOfSubscriptionDate,则可以将Task设置为方法的返回类型:

public interface IExpirationJob
{
    Task SetExpired();
}


public class ExpirationJob : IExpirationJob
{
    private readonly ApplicationDbContext _db;
    private readonly IEmailSender _emailSender;

    public ExpirationJob(ApplicationDbContext db, IEmailSender emailSender)
    {
        _db = db;
        _emailSender = emailSender;
    }

    public async Task SetExpired()
    {
        foreach(var item in _db.Institution)
        {
            if (item.EndOfSubscriptionDate <= DateTime.Today) 
            {
                item.Status = SD.StatusExpired;

              await _emailSender.SendEmailAsync( item.Admin.Email, "Your Account is Expired !", "Your subscription is over and your account is expired."); 
            }
        }
       await _db.SaveChangesAsync();
    }
}
公共接口IExpirationJob
{
任务集过期();
}
公共类过期作业:IExpirationJob
{
私有只读应用程序dbContext_db;
私人只读IEmailSender\u emailSender;
公共过期作业(ApplicationDbContext数据库,IEmailSender)
{
_db=db;
_emailSender=emailSender;
}
公共异步任务SetExpired()
{
foreach(银行机构中的var项目)
{

if(item.EndOfSubscriptionDate)Hangfire还支持
任务
-返回方法。