如何在aspnet核心中间件调用方法中删除线程安全错误?

时间:2017-06-13 10:18:13

标签: asp.net-core-1.0

获取异常"在上一个操作完成之前,在此上下文中启动了第二个操作。任何实例成员都不保证是线程安全的。" 以下是代码。

  public  Task Invoke(HttpContext context)
        {
            try
            {
                var userId =context.Session.GetString("UserId");
                if (userId != null)
                {
                    var user =_context.Users.Where(u => u.Id == userId).FirstOrDefault();
                    user.TimeStamp = DateTime.Now;
                    _context.SaveChanges();
                }
                else
                { }
            }
            catch(Exception ex)
            {
                _logger.LogError(ex.Message);
            }
            // Call the next delegate/middleware in the pipeline
            return this._next(context);
        }

1 个答案:

答案 0 :(得分:0)

我无法通过您的代码告诉我,但我猜测:

  1. _context是您的数据库上下文
  2. 你通过ctor注入它
  3. 正如您所发现的那样,这可能不会起作用。

    而是通过Invoke方法注入db上下文。

    public Task Invoke(HttpContext context, YourDbContext dbContext)
    {
      try 
      { 
          var userId = context.Session.GetString("UserId"); 
          if (userId != null) 
          { 
              var user = dbContext.Users.Where(u => u.Id == userId).FirstOrDefault(); 
              ...
          }
       }
       catch(Exception ex){...}
    }
    

    这可以确保您拥有db上下文的作用域实例,该实例应该是线程安全的。