繁体   English   中英

在此上下文中启动了第二个操作

[英]A second operation started on this context

在我的控制器中,我在保存到 DB 的日期之后执行另一个 Void 函数。 但有时会显示此错误:

在前一个异步操作完成之前,在此上下文中启动了第二个操作。 使用“await”确保在此上下文上调用另一个方法之前已完成任何异步操作。 不保证任何实例成员都是线程安全的。

...这是我的控制器示例:

public ActionResult All(Chapter chapter){

    var x = db.Post.Where(p => p.PostID == chapter.PostID).FirstOrDefault();
    if (x == null){return View(chapter);}

    counter++;

    db.Chapter.Add(chapter);
    db.SaveChangesAsync();                      

    savepost(chapter.PostID, counter);

    return RedirectToAction("Index");
}

这是 Void 方法:

public void savepost(int id,int counter)
{
    var article = db.Post.Find(id);
    article.LastUpdate = DateTime.Now;
    article.ChapterCount = counter;

    db.Entry(article).State = EntityState.Modified;
    db.SaveChanges();
}

我该如何解决这个问题?

最短修复:

//db.SaveChangesAsync(); 
db.SaveChanges(); 

稍微好一点的选择:

public async Task<ActionResult> All(Chapter chapter)
{
   ....
   await db.SaveChangesAsync(); 
   ...
}

您没有等待对 SaveChangesAsync() 的调用,这意味着它将(可以)在单独的线程上分叉。 然后它给你这个错误,一个 DbContext 不能在线程之间共享。

作为练习,您可以对 SavePost() 方法进行类似的更改:

  • 使其成为async Task方法
  • await db.SaveChangesAsync()替换 SaveChanges await db.SaveChangesAsync()
  • 等待调用 SavePost()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM