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