zoukankan      html  css  js  c++  java
  • BUG记录

    EF通过依赖注入的DbContext,在子线程中使用时报错。

    通过.net core做一个定时任务时,想要通过多线程同时调用一个方法。

    foreach (EnumerationAll config in _enumList)
    {
        _logger.Info($"DDQPicFileUpload->开始处理配置:{config.ToJson()}");
        try
        {
            // 异步执行
            Task UploadPics = new Task(() =>
            {
                try
                {
                    DoUploadDDQPics(config);
                }
                catch (Exception ex)
                {
                    _logger.Error($"DDQPicFileUpload->上传异常:{ex}");
                }
            });
            
            UploadPics.Start();
        }
        catch (Exception ex)
        {
            _logger.Error($"DDQPicFileUpload->上传异常:{ex}");
        }
    }
    View Code

    但是在DoUploadDDQPics方法中读取数据库时,发生异常。

    System.ObjectDisposedException
    HResult=0x80131622
    Message=Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances.
    ObjectDisposed_ObjectName_Name
    Source=Microsoft.EntityFrameworkCore

    通过报错信息,大致可以推断是在子线程运行时,主线程已经结束了,从而回收了注入的DbContext实例。

    后将方法稍作修改,通过Task.WaitAll()防止主线程提前结束。

    var tasks = new List<Task>();
    foreach (EnumerationAll config in _enumList)
    {
        _logger.Info($"DDQPicFileUpload->开始处理配置:{config.ToJson()}");
        try
        {
            // 异步执行
            Task UploadPics = new Task(() =>
            {
                try
                {
                    DoUploadDDQPics(config);
                }
                catch (Exception ex)
                {
                    _logger.Error($"DDQPicFileUpload->上传异常:{ex}");
                }
            });
            tasks.Add(UploadPics);
            UploadPics.Start();
        }
        catch (Exception ex)
        {
            _logger.Error($"DDQPicFileUpload->上传异常:{ex}");
        }
    }
    // 主进程需要等待子线程全部执行完毕,防止注入的实例被回收。
    Task.WaitAll(tasks.ToArray());
    View Code

    再次运行正常。

  • 相关阅读:
    微信小程序---自定义三级联动
    jQuery分页插件
    微信小程序点击图片放大
    微信小程序----日期时间选择器(自定义精确到分秒或时段)
    PHP文件上传error的错误类型
    获取url传的参数转变为对象的方法
    mysql忘记密码时,重新修改密码
    表单注册及自定义validate手机验证码验证实例
    登陆jq表单验证及jqcookie记住密码实例
    iframe高度自适应,自适应子页面高度
  • 原文地址:https://www.cnblogs.com/ariter/p/11880572.html
Copyright © 2011-2022 走看看