来自Task的EF:System.InvalidOperationException:Reader已关闭

时间:2017-12-04 10:55:29

标签: c# entity-framework .net-core asp.net-core-2.0

我正在使用任务在后台发送电子邮件。 尽管生成了PDF(作为附件包含在邮件中)(GeneratePdf())。我得到以下例外:

enter image description here

以下是调用GetRegistrationOfChild的代码: enter image description here

修改 以下是加载dbContext的代码(Startup.cs,方法ConfigureServices)。然后在构造函数中用DI解析它。

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

1 个答案:

答案 0 :(得分:2)

实际上这里有很多问题。您的核心问题可能在iter方法中。但是,您尚未提供该方法的代码。如果我不得不猜测,你会根据错误信息以非线程安全的方式使用SendRegisterConfirmationAsync语句。

然而,完全有可能这只是由于处理异步不正确。您正在从同步方法调用异步方法。由于using返回void,您要么吞下异步方法的返回值,要么异步方法是SendEmail(您应该从不做)。在任何一种情况下,由于您没有等待异步方法的结果,因此其余代码正在继续使用它的依赖性。例如,您的async void之类的内容是请求范围的,因此如果该异步方法使用您的DbContext,但在发送响应之前未完成,则上下文将从其下方处理,造成例外。如果您使用async,则需要一直保持异步。

此外,在Web应用程序上下文中确实没有真正的“后台”任务。 DbContext只是从您处理请求的同一个池中提取另一个线程。你可以允许一个线程返回,但你仍然坐在另一个线程上,所以最好的情况是你自己没有买任何东西。最糟糕的情况是,您现在已经有效地减少了服务器的吞吐量,并使您的扩展能力丧失。

如果您想在后台执行某些操作,请将其卸载到后台进程,即在Web应用程序的上下文之外。您可以使用HangfireRevalee等内容。