我正在使用任务在后台发送电子邮件。
尽管生成了PDF(作为附件包含在邮件中)(GeneratePdf()
)。我得到以下例外:
以下是调用GetRegistrationOfChild
的代码:
修改
以下是加载dbContext
的代码(Startup.cs
,方法ConfigureServices
)。然后在构造函数中用DI解析它。
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
答案 0 :(得分:2)
实际上这里有很多问题。您的核心问题可能在iter
方法中。但是,您尚未提供该方法的代码。如果我不得不猜测,你会根据错误信息以非线程安全的方式使用SendRegisterConfirmationAsync
语句。
然而,完全有可能这只是由于处理异步不正确。您正在从同步方法调用异步方法。由于using
返回void,您要么吞下异步方法的返回值,要么异步方法是SendEmail
(您应该从不做)。在任何一种情况下,由于您没有等待异步方法的结果,因此其余代码正在继续使用它的依赖性。例如,您的async void
之类的内容是请求范围的,因此如果该异步方法使用您的DbContext
,但在发送响应之前未完成,则上下文将从其下方处理,造成例外。如果您使用async,则需要一直保持异步。
此外,在Web应用程序上下文中确实没有真正的“后台”任务。 DbContext
只是从您处理请求的同一个池中提取另一个线程。你可以允许一个线程返回,但你仍然坐在另一个线程上,所以最好的情况是你自己没有买任何东西。最糟糕的情况是,您现在已经有效地减少了服务器的吞吐量,并使您的扩展能力丧失。
如果您想在后台执行某些操作,请将其卸载到后台进程,即在Web应用程序的上下文之外。您可以使用Hangfire或Revalee等内容。