C# 来自任务的EF:System.InvalidOperationException:读卡器已关闭

C# 来自任务的EF:System.InvalidOperationException:读卡器已关闭,c#,entity-framework,.net-core,asp.net-core-2.0,C#,Entity Framework,.net Core,Asp.net Core 2.0,我正在使用任务在后台发送电子邮件。 尽管生成了PDF(作为附件包含在邮件中)(GeneratePdf())。我得到以下例外: 下面是调用GetRegistrationOfChild的代码: 编辑 下面是加载dbContext的代码(Startup.cs,方法ConfigureServices)。之后,它在构造函数中用DI解决 services.AddDbContext(选项=> options.UseSqlServer(Configuration.GetConnectionString(“D

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

下面是调用
GetRegistrationOfChild
的代码:

编辑 下面是加载
dbContext
的代码(
Startup.cs
,方法
ConfigureServices
)。之后,它在构造函数中用DI解决

services.AddDbContext(选项=>

options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”))

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

然而,这也完全可能是由于不正确地处理异步。您正在从同步方法调用异步方法。由于
sendmail
返回void,因此您要么接受了异步方法的返回值,要么异步方法是
async void
(您几乎不应该这样做)。在这两种情况下,由于您没有等待异步方法的结果,因此代码的其余部分可能会继续使用它。例如,像您的
DbContext
这样的东西是请求范围的,因此如果异步方法使用了您的
DbContext
,但在发送响应之前没有完成,则上下文将从它下面被释放,从而导致异常。如果使用异步,则需要一直使用异步

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


如果您想在后台执行某些操作,请将其卸载到后台进程,即web应用程序上下文之外。你可以使用或之类的东西。

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

然而,这也完全可能是由于不正确地处理异步。您正在从同步方法调用异步方法。由于
sendmail
返回void,因此您要么接受了异步方法的返回值,要么异步方法是
async void
(您几乎不应该这样做)。在这两种情况下,由于您没有等待异步方法的结果,因此代码的其余部分可能会继续使用它。例如,像您的
DbContext
这样的东西是请求范围的,因此如果异步方法使用了您的
DbContext
,但在发送响应之前没有完成,则上下文将从它下面被释放,从而导致异常。如果使用异步,则需要一直使用异步

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


如果您想在后台执行某些操作,请将其卸载到后台进程,即web应用程序上下文之外。你可以使用类似的或.< /p>什么地方<代码> dWordNo.<代码>?你实际上没有告诉我们从哪里调用代码,中间的缺失位是这里的关键。您是否在上下文有机会检索数据之前关闭/处理它?我编辑了描述。
dbContext
由构造函数中的DI处理。我没有关闭或处理上下文。当您将其分解为多个查询时会发生什么情况?
dbContext
将由容器在web请求结束时处理
GeneratePdf
在web请求之后运行(因为
Task.Run
),因此在
dbContext
被释放之后。你使用的是哪个Ioc容器?<代码> dWordValue/Cudio>是从哪里来的?实际上你没有告诉我们代码从哪里被调用,中间的缺失位是这里的关键。您是否在上下文有机会检索数据之前关闭/处理它?我编辑了描述。
dbContext
由构造函数中的DI处理。我没有关闭或处理上下文。当您将其分解为多个查询时会发生什么情况?
dbContext
将由容器在web请求结束时处理
GeneratePdf
在web请求之后运行(因为
Task.Run
),因此在
dbContext
被释放之后。您正在使用哪个IoC容器?