0

TCPClient用来连接到设备并以字符串形式获取一些数据,然后我试图将数据保存到数据库并获取

“无法访问已处置的对象”错误。”

也许问题是因为我试图从异步回调函数保存到数据库?请看一下,这里有两个函数:第一个获取网络流,已经连接到设备并开始读取数据,第二个是回调:

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);
            }
        }
4

1 回答 1

0

终于找到解决办法了!

所以问题是我使用了 DataContext 依赖,它被注入到控制器构造函数中——它在 HTTP 请求完成后被释放。

所以解决方法是在函数本身手动注入依赖,需要访问数据库:

  1. 在控制器构造函数中注入作用域工厂 IServiceScopeFactory scopeFactory。

  2. 将此添加到我需要访问 DBcontext 的函数中:

    使用 (var scope = _scopeFactory.CreateScope()) { var context = scope.ServiceProvider.GetRequiredService(); ... }

于 2019-02-04T09:33:35.567 回答