Я использую 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);
}
}
Как здесь написано, ваш метод на самом деле не является «асинхронным». И ваш код нельзя использовать как есть. Но да, если они вызываются асинхронно и поле _repo тем временем закрывается / удаляется, это ваша ошибка. Я предполагаю, что вы неправильно обрабатываете время жизни для своего dbcontext.
найти, какая строка вызывает ошибку. и напишите здесь, чтобы получить ответ от человека.
Покопайтесь здесь _repo.saveEventsToDB(events);, выясните, почему вы закрыли и удалили контекст (где-то еще), это будет ваш ответ
Дело в том, что если я вызываю _repo.saveEventsToDB (события) из другого места программы, например, так: [HttpPost ("saveone")] public async Task <IActionResult> saveOne (Event newEvent) {var events = new List < Событие> (); events.Add (newEvent); ожидание _repo.saveEventsToDB (события); вернуть Ok (события); }' оно работает. Итак, я думаю, что проблема в том, что я вызываю это из функции обратного вызова. Есть идеи, что я могу сделать?
Прекратить доступ к удаленному частному полю из обратного вызова? Прекратить управлять своим соединением с тем же временем жизни, что и репозиторий, вопреки передовой практике?
@AFract, не могли бы вы дать совет, как это сделать правильно или где взять пример? Спасибо!





Наконец-то нашел решение!
Проблема заключалась в том, что я использовал зависимость DataContext, которая была введена в конструктор контроллера - и была удалена после завершения HTTP-запроса.
Таким образом, решение состоит в том, чтобы вручную ввести зависимость в самой функции, которой требуется доступ к базе данных:
Внедрить фабрику области видимости IServiceScopeFactory scopeFactory в конструктор контроллера.
Добавьте это в мою функцию, где мне нужен доступ к DBcontext:
используя (var scope = _scopeFactory.CreateScope ()) { var context = scope.ServiceProvider.GetRequiredService (); ... }
Ни один из этих кодов не показывает актуальную проблему, ваш репозиторий (вздох) закрыл контекст