首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试将文件保存到ObjectDisposedException时引发的DbContext

尝试将文件保存到ObjectDisposedException时引发的DbContext
EN

Stack Overflow用户
提问于 2019-03-13 14:07:40
回答 2查看 906关注 0票数 1

我正在上传一个文本文件并将每一行拆分到一个数据库中。这个文件有超过一百万行。上传和保存到数据库的操作正常,但在await _context.SaveChangesAsync();行的保存后中断,出现以下错误

System.ObjectDisposedException HResult=0x80131622 Message=Cannot访问已释放的对象。造成此错误的一个常见原因是处理通过依赖项注入解决的上下文,然后尝试在应用程序的其他位置使用相同的上下文实例。如果在上下文中调用This (),或者将上下文包装在using语句中,则可能会发生这种情况。如果您使用的是依赖注入,则应该让依赖注入容器负责处理上下文实例。对象名称:“LanternDBContext”。

代码语言:javascript
复制
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();
}
EN

回答 2

Stack Overflow用户

发布于 2019-03-13 14:16:20

async void只用于事件处理程序。它触发一个无法等待或监视的火灾和遗忘任务,并且在ASP.NET请求终止并释放其上下文之后仍可能运行很长时间。

不返回anythig的异步方法的正确语法是async Task。方法签名应更改为

代码语言:javascript
复制
public async Task ImportUploadTextFile(string fileName)

无论谁打电话给ImportUploadTextFile,都应该等待它。如果在控制器操作中调用它,则操作本身应该是异步的,并等待它,例如:

代码语言:javascript
复制
public async Task Post(whatever)
{
    ....
    await ImportUploadTextFile(fileName);
}
票数 2
EN

Stack Overflow用户

发布于 2019-03-13 14:13:10

当您试图保存更改时,您的db上下文将被释放。可能是你的方法

ImportUploadTextFile

在适当的范围内使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55143857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档