无法访问已处置的对象:DataContext

时间:2019-01-04 08:09:08

标签: c# .net tcpclient beginread

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

  

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

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

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

1 个答案:

答案 0 :(得分:0)

终于找到了解决方案!

所以问题是我使用了DataContext依赖关系,该依赖关系被注入到控制器构造函数中-并且在HTTP请求完成后就被废弃了。

因此解决方案是在函数本身中手动注入依赖关系,该函数需要访问数据库:

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

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

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