C# 无法访问ASP.NET核心后台服务中已释放的对象

C# 无法访问ASP.NET核心后台服务中已释放的对象,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我试图弄清楚为什么我的数据库上下文会被下面的代码破坏。我试图在整个处理阶段更新记录的状态,但在尝试保存对htis实体的状态字段的更改时出现异常 在.SaveChanges()或.FirstOrDefault()调用上使用异步或非异步方法没有区别 这已注册为由IHostedService运行 IHostedService: public class HostedDaemon : IHostedService { private readonly ILogger<HostedDaemo

我试图弄清楚为什么我的数据库上下文会被下面的代码破坏。我试图在整个处理阶段更新记录的状态,但在尝试保存对htis实体的状态字段的更改时出现异常

在.SaveChanges()或.FirstOrDefault()调用上使用异步或非异步方法没有区别

这已注册为由IHostedService运行

IHostedService:

public class HostedDaemon : IHostedService
{
    private readonly ILogger<HostedDaemon> _logger;
    private Timer _queueTimer;
    private Timer _runTimer;
    private IServiceProvider Services { get; set; }

    public HostedDaemon(IServiceProvider services, ILogger<HostedDaemon> logger)
    {
        Services = services;
        _logger = logger;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        var queueAutoEvent = new AutoResetEvent(false);
        _logger.LogInformation("HostedDaemon Starting");
        _queueTimer = new Timer(QueueJobs, queueAutoEvent, TimeSpan.Zero,
            TimeSpan.FromSeconds(900));
        _runTimer = new Timer(RunQueuedJobs, queueAutoEvent, TimeSpan.Zero,
            TimeSpan.FromSeconds(10));
        return Task.CompletedTask;
    }
    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("HostedDaemon Stopping");
        _queueTimer?.Change(Timeout.Infinite, 0);
        _runTimer?.Change(Timeout.Infinite, 0);
        return Task.CompletedTask;
    }
    public void Dispose()
    {
        _queueTimer?.Dispose();
        _runTimer?.Dispose();
    }

    private void QueueJobs(object stateInfo)
    {
        using (var scope = Services.CreateScope())
        {
            var autoEvent = (AutoResetEvent)stateInfo;
            var daemonProcessing = scope.ServiceProvider.GetRequiredService<IDaemonService>();
            //daemonProcessing.QueueJob();
            //daemonProcessing.RunJob();
            autoEvent.Set();
        }
    }
    private void RunQueuedJobs(object stateInfo)
    {
        using (var scope = Services.CreateScope())
        {
            var autoEvent = (AutoResetEvent)stateInfo;
            var daemonProcessing = scope.ServiceProvider.GetRequiredService<IDaemonService>();
            //daemonProcessing.QueueJob();
             daemonProcessing.RunJob(); 
            autoEvent.Set();
        }
    }
}
启动配置:

public void ConfigureServices(IServiceCollection services)
    {
        DynamicsAccountGuid = Configuration["Services:Dynamics:AccountGuid"];
        DynamicsCompany = Configuration["Services:Dynamics:Companies:Development"];
        DynamicsBasicAuth = Configuration["Services:Dynamics:BasicAuth"];
        ConnectionString = Configuration["ConnectionStrings:FIS_Local"];

        services.AddSingleton(Configuration);
        services.AddEntityFrameworkSqlServer()
            .AddDbContext<FisEntities>(options => options.UseSqlServer(ConnectionString));

        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddHttpClient<IRequestClient, DynamicsClient>("dynamics", d =>
        {
            d.BaseAddress = new Uri($"https://api.businesscentral.dynamics.com/v1.0/{DynamicsAccountGuid}/api/beta/companies/{DynamicsCompany}");
            d.DefaultRequestHeaders.Add("Authorization", DynamicsBasicAuth);
        });

        services.AddTransient<IQueueClient, CrmClient>();
        services.AddHostedService<HostedDaemon>();
        services.AddScoped<IDaemonService, TransactionService>();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }
public void配置服务(IServiceCollection服务)
{
DynamicsAccountGuid=配置[“服务:动态:AccountGuid”];
dynamiccompany=Configuration[“服务:动态:公司:开发”];
DynamicsBasicAuth=配置[“服务:动态:BasicAuth”];
ConnectionString=配置[“ConnectionString:FIS_Local”];
services.AddSingleton(配置);
services.AddEntityFrameworkSqlServer()
.AddDbContext(options=>options.UseSqlServer(ConnectionString));
配置(选项=>
{
//此lambda确定给定请求是否需要非必要cookie的用户同意。
options.checkApprovered=context=>true;
options.MinimumSameSitePolicy=SameSiteMode.None;
});
services.AddHttpClient(“dynamics”,d=>
{
d、 BaseAddress=新Uri($”https://api.businesscentral.dynamics.com/v1.0/{DynamicsAccountGuid}/api/beta/companys/{DynamicsCompany}”);
d、 DefaultRequestHeaders.Add(“授权”,dynamicBasicAuth);
});
services.AddTransient();
services.AddHostedService();
services.addScope();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

HostedDaemon
类中的
RunQueuedJobs
方法中,替换
daemonProcessing.RunJob()
daemonProcessing.RunJob().Wait()一起使用如下所示:

private void RunQueuedJobs(object stateInfo)
{
    using (var scope = Services.CreateScope())
    {
        var autoEvent = (AutoResetEvent)stateInfo;
        var daemonProcessing = scope.ServiceProvider.GetRequiredService<IDaemonService>();
        //daemonProcessing.QueueJob();
         daemonProcessing.RunJob().Wait(); // <-- Here it is
        autoEvent.Set();
    }
}
private void RunQueuedJobs(对象状态信息)
{
使用(var scope=Services.CreateScope())
{
var autoEvent=(AutoResetEvent)stateInfo;
var daemonProcessing=scope.ServiceProvider.GetRequiredService();
//daemonProcessing.QueueJob();

daemonProcessing.RunJob().Wait();//获取异常时,请记住将实际的错误消息发布到问题中。从上面的内容来看,任何内容都不应处理上下文
我获取异常
-为什么不将异常消息添加到问题中?请将整个异常消息添加到问题中,并使用整个方法排除方法签名。您是否碰巧使用了Oracle的某个旧的/时髦的MySQL提供程序?@Gibbon这是一个通用对象处理异常,但我已经添加了其中的文本。@TanvirArjel添加了,但它是通用的
public void ConfigureServices(IServiceCollection services)
    {
        DynamicsAccountGuid = Configuration["Services:Dynamics:AccountGuid"];
        DynamicsCompany = Configuration["Services:Dynamics:Companies:Development"];
        DynamicsBasicAuth = Configuration["Services:Dynamics:BasicAuth"];
        ConnectionString = Configuration["ConnectionStrings:FIS_Local"];

        services.AddSingleton(Configuration);
        services.AddEntityFrameworkSqlServer()
            .AddDbContext<FisEntities>(options => options.UseSqlServer(ConnectionString));

        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddHttpClient<IRequestClient, DynamicsClient>("dynamics", d =>
        {
            d.BaseAddress = new Uri($"https://api.businesscentral.dynamics.com/v1.0/{DynamicsAccountGuid}/api/beta/companies/{DynamicsCompany}");
            d.DefaultRequestHeaders.Add("Authorization", DynamicsBasicAuth);
        });

        services.AddTransient<IQueueClient, CrmClient>();
        services.AddHostedService<HostedDaemon>();
        services.AddScoped<IDaemonService, TransactionService>();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }
private void RunQueuedJobs(object stateInfo)
{
    using (var scope = Services.CreateScope())
    {
        var autoEvent = (AutoResetEvent)stateInfo;
        var daemonProcessing = scope.ServiceProvider.GetRequiredService<IDaemonService>();
        //daemonProcessing.QueueJob();
         daemonProcessing.RunJob().Wait(); // <-- Here it is
        autoEvent.Set();
    }
}