我有一些类实现了 IHostedService。
电子邮件发送服务:
public class EMailSendService : IHostedService, IDisposable
{
private Timer _timer;
private IMailAccountService _mailAccountService;
private IMailTaskDAL _mailTaskDal;
private LoggerServiceBase _loggerServiceBase;
public EMailSendService(IMailAccountService mailAccountService, IMailTaskDAL mailTaskDal)
{
_mailAccountService = mailAccountService;
_mailTaskDal = mailTaskDal;
_loggerServiceBase = (LoggerServiceBase)Activator.CreateInstance(typeof(DatabaseLogger));
}
private void SendMail(object state)
{
var isAnyMailSended = false;
var logDetail = new LogDetail
{
UserID = "",
UserAgent = "",
IP = "System",
MethodName = "SENDMAILTASK",
StackTrace = "",
TraceIdentifier = ""
};
try
{
var now = DateTime.Now;
var mailTasks = _mailTaskDal.GetList(op => !op.IsSended && op.NextSendDate < now && op.TryCount < 10);
isAnyMailSended = mailTasks.Count > 0;
foreach (var mailTask in mailTasks)
{
var toList = mailTask.ToList.Split(',');
var sendResult = _mailAccountService.SendMail(toList, mailTask.Subject, mailTask.Body);
mailTask.Result = sendResult.Messages[0].Description;
if (sendResult.Success)
{
mailTask.IsSended = true;
mailTask.SendDate = DateTime.Now;
}
else
{
mailTask.NextSendDate = DateTime.Now.AddMinutes(5);
mailTask.TryCount++;
}
_mailTaskDal.Update(mailTask);
}
}
catch (Exception e)
{
logDetail.ExceptionMessage = e.Message;
logDetail.StackTrace = e.StackTrace;
}
finally
{
if (isAnyMailSended)
_loggerServiceBase.Info(logDetail);
}
}
public System.Threading.Tasks.Task StartAsync(CancellationToken cancellationToken)
{
_timer = new Timer(SendMail, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
return System.Threading.Tasks.Task.CompletedTask;
}
public System.Threading.Tasks.Task StopAsync(CancellationToken cancellationToken)
{
_timer?.Change(Timeout.Infinite, 0);
return System.Threading.Tasks.Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
创建活动任务:
public class CreateActivityTask : IHostedService, IDisposable
{
private Timer _timer;
private LoggerServiceBase _loggerServiceBase;
public CreateActivityTask()
{
_loggerServiceBase = (LoggerServiceBase)Activator.CreateInstance(typeof(DatabaseLogger));
}
private void CreateActivity(object state)
{
var logDetail = new LogDetail
{
UserID = "",
UserAgent = "",
IP = "System",
MethodName = "CreateActivityTask",
StackTrace = "",
TraceIdentifier = ""
};
try
{
//create activity
}
catch (Exception e)
{
logDetail.ExceptionMessage = e.Message;
logDetail.StackTrace = e.StackTrace;
}
finally
{
_loggerServiceBase?.Info(logDetail);
}
}
public System.Threading.Tasks.Task StartAsync(CancellationToken cancellationToken)
{
_timer = new Timer(CreateActivity, null, TimeSpan.Zero, TimeSpan.FromSeconds(60));
return System.Threading.Tasks.Task.CompletedTask;
}
public System.Threading.Tasks.Task StopAsync(CancellationToken cancellationToken)
{
_timer?.Change(Timeout.Infinite, 0);
return System.Threading.Tasks.Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
我使用两个扩展函数在 startup.cs -> ConfigureServices 中添加这些类:
services.AddHostedService<EMailSendService>();
services.AddHostedService<CreateActivityTask>();
但是如果我这样使用,程序就不会运行。当我启动它时,此代码会引发错误:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run(); // This is where throws error
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
错误详情:
System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=Microsoft.Extensions.Hosting
StackTrace:
at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>d__9.MoveNext()
如果我评论
services.AddHostedService();
我仍然得到错误。但是,如果我评论所有“CreateActivityTask”类和“services.AddHostedService();”,那么我可以运行该应用程序。
EmailTaskService 可以正常运行。但是,如果我单独留下“CreateActivityTask”(我的意思是,我评论了所有“EmailTaskService 类等..),程序会再次出错。
我在 CreateActivity 类上看不到任何错误,所以我找不到错误在哪里。请问你能帮帮我吗?