我正在上传一个文本文件,并将每个分割行写入数据库。该文件有超过一百万行。上传和保存到数据库有效,但在await _context.SaveChangesAsync();
行中保存后由于以下错误而中断
System.ObjectDisposedException HResult = 0x80131622 Message =无法访问已处置的对象。导致此错误的常见原因是,处理从依赖项注入中解决的上下文,然后稍后尝试在应用程序中的其他位置使用相同的上下文实例。如果在上下文上调用Dispose()或将上下文包装在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();
}
答案 0 :(得分:2)
async void
仅适用于事件处理程序。它触发了一个即发即弃的任务,该任务无法等待或监视,并且在ASP.NET请求终止并处理其上下文之后仍可以运行很长时间。
不返回anythig的异步方法的正确语法是async Task
。方法签名应更改为
public async Task ImportUploadTextFile(string fileName)
,呼叫ImportUploadTextFile
的人都应等待。如果在控制器动作中调用了该动作,则动作本身应该是异步的并等待它,例如:
public async Task Post(whatever)
{
....
await ImportUploadTextFile(fileName);
}
答案 1 :(得分:1)
您尝试保存更改时将丢弃数据库上下文。可能是您的方法
ImportUploadTextFile
超出了适当范围使用。