System.ObjectDisposeException: невозможно получить доступ к удаленному экземпляру контекстаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 System.ObjectDisposeException: невозможно получить доступ к удаленному экземпляру контекста

Сообщение Anonymous »

У меня возникла проблема, когда я выполняю "await AlarmHandler.InitRedis("setting");":"System.ObjectDisposeException: невозможно получить доступ к удаленному экземпляру контекста. Распространенной причиной этой ошибки является удаление экземпляра контекста, который был разрешен. из внедрения зависимостей, а затем позже пытаетесь использовать тот же экземпляр контекста в другом месте вашего приложения. Это может произойти, если вы вызываете Dispose для экземпляра контекста или помещаете его в оператор использования. Если вы используете внедрение зависимостей, вам следует это сделать. пусть контейнер внедрения зависимостей позаботится об удалении экземпляров контекста."
Это мой код:
  • program.cs
c#
builder.Services.AddHostedService();
builder.Services.AddScoped();
  • Тревога
c#
public class Alarm : IHostedService, IDisposable
{
private readonly MqttFactory mqttFactory;
private readonly MqttBrokerOptions? _mqttBrokerOptions;
private readonly IoTDbContext _context;
private readonly RabbitMQSet _rabbitMQSet;
private readonly IDbContextFactory _dbContextFactory;
private readonly IMapper _mapper;
private AlarmHnadler alarmHandler;
private readonly IServiceScopeFactory _serviceScopeFactory;
private IModel? _channel { get; set; }
private readonly RedisUtils _redisUtils;

public Alarm(IModel channel, IOptions mqttBrokerOptions, IConfiguration configuration,
SmsClient smsClient, VoiceMessagingService voiceMessagingService,
IDbContextFactory dbContextFactory, IMapper mapper,
IHubContext hubContext,IServiceScopeFactory serviceScopeFactory)
{
mqttFactory = new MqttFactory();
_mqttBrokerOptions = mqttBrokerOptions.Value;
_dbContextFactory = dbContextFactory;
_context = dbContextFactory.CreateDbContext();
_channel = channel;
_mapper = mapper;
_redisUtils = new RedisUtils(configuration, _context, _mapper);
_serviceScopeFactory = serviceScopeFactory;
using (var scope = _serviceScopeFactory.CreateScope())
{
alarmHandler = scope.ServiceProvider.GetRequiredService();
}

}
public async Task StartAsync(CancellationToken cancellationToken)
{
var userName = "Server";
var password = "123456".AESEncrypt(mode: CipherMode.ECB, padding: PaddingMode.Zeros, base64: false);
var mqttClientOptions = new MqttClientOptionsBuilder()
.WithTcpServer(_mqttBrokerOptions?.Host, _mqttBrokerOptions?.Port)
.WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V500)
.WithCredentials(userName, password)
.WithCleanSession()
.Build();
MqttSet.Client = mqttFactory.CreateMqttClient();
MqttSet.Client.ConnectedAsync += Client_ConnectedAsync;
MqttSet.Client.DisconnectedAsync += Client_DisconnectedAsync;
MqttSet.Client.ApplicationMessageReceivedAsync += Client_ApplicationMessageReceivedAsync;
await MqttSet.Client.ConnectAsync(mqttClientOptions, CancellationToken.None);

await alarmHandler.InitRedis("setting");

}
AlarmHnadler
c#
public class AlarmHnadler : ControllerBase
{
private readonly IConfiguration _configuration;
private readonly SmsClient _smsClient;
private readonly VoiceMessagingService _voiceMessagingService;
private readonly IoTDbContext _context;
private readonly IDbContextFactory _dbContextFactory;
private readonly IMapper _mapper;
private readonly IDatabase _redisDB;
private readonly AlarmUtils _alarmUtil;
private readonly RedisUtils _redisUtils;
private Dictionary gatewaytAlarmDict { get; set; }
private readonly IHubContext _hubContext;

private IModel? _channel { get; set; }
public IBatch batch { get; set; }

public AlarmHnadler(IModel channel, IDbContextFactory dbContextFactory,
IConfiguration configuration, IHubContext hubContext,
IMapper mapper, SmsClient smsClient, VoiceMessagingService voiceMessagingService)
{
_configuration = configuration;
_dbContextFactory = dbContextFactory;
_alarmUtil = new AlarmUtils(_configuration);
var settingValue = _configuration["RedisDb"];
_channel = channel;
int.TryParse(settingValue, out int result);
_redisDB = RedisClient.GetDatabase(result);
_context = dbContextFactory.CreateDbContext();
_smsClient = smsClient;
_voiceMessagingService = voiceMessagingService;
_mapper = mapper;
gatewaytAlarmDict = new Dictionary();
_hubContext = hubContext;
setGatewayAlarmDictValue();
batch = _redisDB.CreateBatch();
_redisUtils = new RedisUtils(_configuration, _context, _mapper);
}
public async Task InitRedis(string tableName)
{
switch (tableName)
{
case "setting":
batch.KeyDeleteAsync("setting");
var alarmPointSettings =
await _context.Set().Where(a => a.Status == 1).ToListAsync();
var result =
_mapper.Map(alarmPointSettings);
var settingR = result.Select(item => JsonConvert.SerializeObject(item))
.Select((json, index) => new { Id = alarmPointSettings[index].Id.ToString(), Json = json })
.ToList();
foreach (var r in settingR)
{
batch.HashSetAsync("setting", r.Id, r.Json);
}

batch.Execute();
break;
}

Если бы вы могли помочь мне решить эту проблему, я был бы очень признателен.
Я больше не внедряю контекст напрямую; вместо этого я использую ContextFactory для его создания. Я думаю, что эта проблема была решена. Но я не знаю, почему. Область, обведенная красным на изображении ниже, является моей модификацией.
введите здесь описание изображения
ps :Изначально я не использовал внедрение зависимостей; вместо этого я напрямую создавал экземпляры объектов (используя «new»), что тоже сработало. Вот так
c#
// alarmHandler = new AlarmHnadler(_channel, _dbContextFactory, configuration, hubContext,
// _context, _mapper, smsClient, voiceMessagingService);


Подробнее здесь: https://stackoverflow.com/questions/786 ... t-instance
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»