Невозможно получить доступ к удаленному объекту: DataContext

Я использую TCPClient для подключения к устройству и получения данных в виде строк, затем я пытаюсь сохранить данные в БД и получить

"Cannot access a disposed object" error."

Может быть, проблема в том, что я пытаюсь сохранить в БД из асинхронной функции обратного вызова? Обратите внимание, здесь две функции: первая получает сетевой поток, уже подключенный к устройству, и начинает считывать данные, вторая - обратный вызов:

private void ReadDataAsync(NetworkStream nwStream)
        {
            byte[] buffer = new byte[1024];

            messageStream mStream = new messageStream(nwStream, buffer);

            if (nwStream.CanRead)
            {
                Console.WriteLine("Starting async");
                nwStream.BeginRead(buffer, 0, buffer.Length,
                    new AsyncCallback(OnReadEndAsync), mStream);
            }

            else
            {
                Console.WriteLine("Cannot read stream");
            }
        }

        private void OnReadEndAsync(IAsyncResult result)
        {
            String message = "";

            messageStream mStream = (messageStream)result.AsyncState;
            int incDataSize = mStream.nwStream.EndRead(result);

            message = Encoding.ASCII.GetString(mStream.buffer, 0, incDataSize);
            List<Event> events = new List<Event>();
            events = ProcessMessage(message);
            if (events.Any())
                 _repo.saveEventsToDB(events);
            if (mStream.nwStream.CanRead)
            {
                mStream.nwStream.BeginRead(mStream.buffer, 0, mStream.buffer.Length,
                    new AsyncCallback(OnReadEndAsync), mStream);
            }
        }

Ни один из этих кодов не показывает актуальную проблему, ваш репозиторий (вздох) закрыл контекст

TheGeneral 04.01.2019 09:11

Как здесь написано, ваш метод на самом деле не является «асинхронным». И ваш код нельзя использовать как есть. Но да, если они вызываются асинхронно и поле _repo тем временем закрывается / удаляется, это ваша ошибка. Я предполагаю, что вы неправильно обрабатываете время жизни для своего dbcontext.

AFract 04.01.2019 09:11

найти, какая строка вызывает ошибку. и напишите здесь, чтобы получить ответ от человека.

Arphile 04.01.2019 09:12

Покопайтесь здесь _repo.saveEventsToDB(events);, выясните, почему вы закрыли и удалили контекст (где-то еще), это будет ваш ответ

TheGeneral 04.01.2019 09:17

Дело в том, что если я вызываю _repo.saveEventsToDB (события) из другого места программы, например, так: [HttpPost ("saveone")] public async Task <IActionResult> saveOne (Event newEvent) {var events = new List < Событие> (); events.Add (newEvent); ожидание _repo.saveEventsToDB (события); вернуть Ok (события); }' оно работает. Итак, я думаю, что проблема в том, что я вызываю это из функции обратного вызова. Есть идеи, что я могу сделать?

Денис Пархоменко 04.01.2019 11:31

Прекратить доступ к удаленному частному полю из обратного вызова? Прекратить управлять своим соединением с тем же временем жизни, что и репозиторий, вопреки передовой практике?

AFract 04.01.2019 12:06

@AFract, не могли бы вы дать совет, как это сделать правильно или где взять пример? Спасибо!

Денис Пархоменко 06.01.2019 10:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
103
1

Ответы 1

Наконец-то нашел решение!

Проблема заключалась в том, что я использовал зависимость DataContext, которая была введена в конструктор контроллера - и была удалена после завершения HTTP-запроса.

Таким образом, решение состоит в том, чтобы вручную ввести зависимость в самой функции, которой требуется доступ к базе данных:

  1. Внедрить фабрику области видимости IServiceScopeFactory scopeFactory в конструктор контроллера.

  2. Добавьте это в мою функцию, где мне нужен доступ к DBcontext:

    используя (var scope = _scopeFactory.CreateScope ()) { var context = scope.ServiceProvider.GetRequiredService (); ... }

Другие вопросы по теме