我正在使用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);
}
}
答案 0 :(得分:0)
终于找到了解决方案!
所以问题是我使用了DataContext依赖关系,该依赖关系被注入到控制器构造函数中-并且在HTTP请求完成后就被废弃了。
因此解决方案是在函数本身中手动注入依赖关系,该函数需要访问数据库:
在控制器构造函数中注入作用域工厂IServiceScopeFactory scopeFactory。
将此添加到需要访问DBcontext的函数中:
使用(var scope = _scopeFactory.CreateScope()) { var context = scope.ServiceProvider.GetRequiredService(); ... }