当前位置: 首页 > 知识库问答 >
问题:

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

单于庆
2023-03-14

在我的控制器中,我在保存到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();
}

我怎么解决这个问题?

共有1个答案

闾丘德业
2023-03-14

最短修复:

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

稍好的选择:

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

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

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

  • 使其成为异步任务
  • 将SaveChanges()替换为wait db。SaveChangesAsync()
  • 等待调用SavePost()
 类似资料:
  • 消息: 代码: 我尝试的: 我不知道我做错了什么,我尝试了不同的方法,比如: 1. 2. 3. 我做错了什么?

  • 在winform应用程序中使用EntityFrmework 6.2异步方法时,我遇到了一个问题。我们使用自定义类来管理基于单个活动设置的同步或异步EntityFrmework访问。当我们使用同步访问时,一切正常。当我们使用异步调用时,我们遇到了这个问题:在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在该上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能

  • 我有一个循环,在循环中我正在做: 第二种方法使用EF获取实体,设置一些属性,并通过调用DbContext上的wait SaveChangesAsync()将实体保存回数据存储。 上面应该等待1s,然后继续第二种方法。通过上述实现,我得到以下异常: 在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在该上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线

  • 我试图将我的XSD验证为有效的XSD(与针对XML的验证相反),但我得到以下错误: XmlSchema错误:元素http://www.w3.org/2001/XMLSchema:简单类型在此上下文中无效。第6行,位置17。相关模式项SourceUri:虚拟://server/schema.xsd,第4行,位置12。 我一直在研究它,但我发现的一切都让我认为我的观点是正确的——所以这可能是一些明显而

  • 我在两个独立的Web应用程序中工作,一个后台和前端应用程序。有趣的是,当我运行后端时,我没有任何问题。但在前端,我遇到了以下错误: 两者都在同一个Tomcat上运行。我的同事有相同的代码,它工作正常:-s

  • 我刚开始使用Xamarin和VisualStudio2017在C#中为Android开发。与Windows生态系统完全不同的范例…Target是一个商业应用程序,将有特定的受众,但在我深入了解之前,我只是试图学习绳子,理解概念和程序… 因此,我从最简单的app开始,使用空白模板。这将创建一个项目,其中包含一个活动(mainactivity.cs)、两个资源(resources\layout\mai