我正在上传一个文本文件并将每一行拆分到一个数据库中。这个文件有超过一百万行。上传和保存到数据库的操作正常,但在await _context.SaveChangesAsync();行的保存后中断,出现以下错误
System.ObjectDisposedException HResult=0x80131622 Message=Cannot访问已释放的对象。造成此错误的一个常见原因是处理通过依赖项注入解决的上下文,然后尝试在应用程序的其他位置使用相同的上下文实例。如果在上下文中调用This (),或者将上下文包装在using语句中,则可能会发生这种情况。如果您使用的是依赖注入,则应该让依赖注入容器负责处理上下文实例。对象名称:“LanternDBContext”。
public async void ImportUploadTextFile(string fileName)
{
string rootFolder = _hostingEnvironment.WebRootPath;
using (StreamReader sr = new StreamReader(Path.Combine(rootFolder + "/UploadedFiles/", fileName)))
{
List<UploadTextFile> InputList = new List<UploadTextFile>();
while (sr.Peek() >= 0)
{
string str;
string[] strArray;
str = sr.ReadLine();
strArray = str.Split(' ');
InputList.Add(new UploadTextFile
{
CorpCode = strArray[0],
AccountCode = strArray[1],
CostCenter = strArray[2]
});
}
_context.UploadTextFile.AddRange(InputList);
}
await _context.SaveChangesAsync();
}发布于 2019-03-13 14:16:20
async void只用于事件处理程序。它触发一个无法等待或监视的火灾和遗忘任务,并且在ASP.NET请求终止并释放其上下文之后仍可能运行很长时间。
不返回anythig的异步方法的正确语法是async Task。方法签名应更改为
public async Task ImportUploadTextFile(string fileName)无论谁打电话给ImportUploadTextFile,都应该等待它。如果在控制器操作中调用它,则操作本身应该是异步的,并等待它,例如:
public async Task Post(whatever)
{
....
await ImportUploadTextFile(fileName);
}发布于 2019-03-13 14:13:10
当您试图保存更改时,您的db上下文将被释放。可能是你的方法
ImportUploadTextFile
在适当的范围内使用。
https://stackoverflow.com/questions/55143857
复制相似问题