代码之家  ›  专栏  ›  技术社区  ›  parismiguel

任务工厂StarNew和ApplicationDbContext更新

  •  0
  • parismiguel  · 技术社区  · 7 年前

    我需要更新任务中ApplicationDbContext的表;然而,我没有完成。以下是我收到的错误消息:

    例如,Message=“无法访问已处理的对象。这是一个常见的原因 处理从依存关系解析的上下文时出错 在应用程序的其他位置。如果您打电话,可能会发生这种情况 处置

    我知道这与我不太熟悉的线程有关。

    代码如下:

      [HttpPost]
            public ActionResult WebHook([FromBody] BotRequest data)
            {
    
             Task.Factory.StartNew(() =>
                    {
    
                    //Read value from Table
                    ContextWatsonFB contextWatsonFB = _context.ContextWatsonFB.Where(m => m.RecipientId == recipientid).FirstOrDefault();
    
                    if (contextWatsonFB == null)
                    {
                        contextWatsonFB = new ContextWatsonFB()
                        {
                            RecipientId = recipientid
                        };
                        _context.Add(contextWatsonFB);
                        _context.SaveChanges();
    
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(contextWatsonFB.Context))
                        {
                            model = JsonConvert.DeserializeObject<Context>(contextWatsonFB.Context);
                        }
    
                    }
    
                    ///DO SOME STUFF ////////////////
    
                    ///Here I need to update my table using some values processed above in "some stuff"
    
                    ContextWatsonFB contextWatsonFB = _context.ContextWatsonFB.Where(m => m.RecipientId == recipientid).FirstOrDefault();
    
                    contextWatsonFB.Context = JsonConvert.SerializeObject(context);
                    _context.Update(contextWatsonFB);
                    _context.SaveChanges();
    
                    }
            }
    

    正如你所知道的,这是Facebook的一个webhook连接,需要在一个任务中处理这个过程。在“some stuff”中,基本上我正在使用IBM Watson对话服务,该服务会保留一个对话“上下文”,我无法将其来回发送到Facebook,这就是为什么我会将此类数据保留在一个表中,以保留来自Facebook messenger的多个请求之间的差异。

    1 回复  |  直到 7 年前
        1
  •  1
  •   parismiguel    7 年前

    幸运的是,以下代码成功了:

            private readonly IServiceProvider _provider;
    
            public FacebookBotController(ApplicationDbContext context, IServiceProvider provider)
            {
                _provider = provider;
    
    }
    
      [HttpPost]
            public ActionResult WebHook([FromBody] BotRequest data)
            {
    
                if (data == null || data?.entry?.Count == 0)
                {
                    return new StatusCodeResult(StatusCodes.Status204NoContent);
                }
    
    
                try
                {
    
                    var task = Task.Factory.StartNew(async () =>
                    {
    
                        using (IServiceScope scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope())
                        {
                            ApplicationDbContext _contx = _provider.GetService<ApplicationDbContext>();
    
                            ContextWatsonFB contextWatsonFB = await _contx.ContextWatsonFB.Where(m => m.SenderId == senderId).FirstOrDefaultAsync();
    
                            if (contextWatsonFB == null)
                            {
                                context = null;
                            }
                            else
                            {
                                context = JsonConvert.DeserializeObject<Context>(contextWatsonFB.Context);
                            }
    
                        }
    
    }
    }