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

第二个操作已开始

司徒焕
2023-03-14

当我开始我的页面时,一切都加载正常,我第二次尝试重新加载,我收到以下错误,我从角度运行网址

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

这就是方法

    private readonly PuntovService  puntovService = new PuntovService(new PuntovRepository(CentralContext.Create()));
    private readonly IMapper mapper;

    public PuntovController()
    {
        this.mapper = WebApiApplication.MapperConfiguration.CreateMapper();
    }


    [HttpGet]
    [Route("Puntos")]
    [ResponseType(typeof(IEnumerable<PuntovDTO>))]
    public async Task<IHttpActionResult> GetAll()
    {
        var pv = await puntovService.GetAll();
        var puntovDTO = pv.Select(x =>  mapper.Map<PuntovDTO>(x));
        var tipoComitePersona = from com in puntovDTO
                                select  new {com.PuntoV};
        return Ok(tipoComitePersona);
    }

在这个类中,调用将成为数据库的上下文

using APICentralBL.Models;
using System.Data.Entity;

namespace APICentralBL.Data
{

    public  class CentralContext : DbContext
    {

        private static CentralContext centralContext = null;
        public CentralContext() : base("Context") 
        {
        
        }
        public DbSet<SDN> SDN {  get; set;}
        public DbSet<CALIF> CALIF { get; set; }
        public DbSet<UVT> UVT { get; set; }
        public DbSet<PUNTOV> PUNTOV { get; set; }
        public DbSet<TRANS> TRANS { get; set; }

        public static CentralContext Create()
        {
            if (centralContext == null)
                centralContext = new CentralContext();
              return centralContext;
        }
    }
}

这种情况不仅发生在这个方法中,当我尝试调用多个时也会发生

例如。StackTrace

   en System.Data.Entity.Internal.ThrowingMonitor.EnsureNotEntered()
   en System.Data.Entity.Core.Objects.ObjectQuery`1.System.Data.Entity.Infrastructure.IDbAsyncEnumerable<T>.GetAsyncEnumerator()
   en System.Data.Entity.Infrastructure.IDbAsyncEnumerableExtensions.ForEachAsync[T](IDbAsyncEnumerable`1 source, Action`1 action, CancellationToken cancellationToken)
   en System.Data.Entity.Infrastructure.IDbAsyncEnumerableExtensions.ToListAsync[T](IDbAsyncEnumerable`1 source, CancellationToken cancellationToken)
   en System.Data.Entity.Infrastructure.IDbAsyncEnumerableExtensions.ToListAsync[T](IDbAsyncEnumerable`1 source)
   en APICentralBL.Repositories.Implements.GenericRepository`1.<GetAll>d__3.MoveNext() en D:\ANTIOQUENA DEVELOPERS REPOSITORY\ANTIOQUENA DEVELOPERS\DEVELOPMENTS\API'S PROJECT\APICentral-Deploy\APICentralBL\Repositories\Implements\GenericRepository.cs: línea 33
   en System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   en System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   en APICentralBL.Services.Implements.GenericService`1.<GetAll>d__3.MoveNext() en D:\ANTIOQUENA DEVELOPERS REPOSITORY\ANTIOQUENA DEVELOPERS\DEVELOPMENTS\API'S PROJECT\APICentral-Deploy\APICentralBL\Services\Implements\GenericService.cs: línea 25
   en System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   en System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   en APICentral.Controllers.PuntovController.<GetAll>d__4.MoveNext() en D:\ANTIOQUENA DEVELOPERS REPOSITORY\ANTIOQUENA DEVELOPERS\DEVELOPMENTS\API'S PROJECT\APICentral-Deploy\APICentral\Controllers\PuntovController.cs: línea 65**

共有1个答案

柳俊逸
2023-03-14

由于您的上下文存储在静态字段中,因此它将由同时向您的控制器提供请求的所有线程共享。您通常应该为每个请求使用上下文

 类似资料:
  • 我得到了关于在上一个异步操作结束之前在上下文上启动第二个异步操作的错误,但我没有看到它发生在哪里。这是我正在使用的代码。每个异步调用都使用await,那么我做错了什么? 这是Web API 2调用上的一种方法。 当它到达最后一行时,就是抛出异常的地方。 异常消息: 在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在该上下文上调用另一个方法之前已完成任何异步操作。任何实

  • 先前说了树的基本操作,我们采用的是二叉链表来保存树形结构,当然二叉有二叉的困扰之处,比如我想找到当前结点 的“前驱”和“后继”,那么我们就必须要遍历一下树,然后才能定位到该“节点”的“前驱”和“后继”,每次定位都是O(n),这 不是我们想看到的,那么有什么办法来解决呢? (1) 在节点域中增加二个指针域,分别保存“前驱”和“后继”,那么就是四叉链表了,哈哈,还是有点浪费空间啊。 (2) 看下面的这

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

  • 在我的控制器中,我在保存到DB的日期之后执行另一个Void函数。但有时会出现这种错误: 在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在该上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线程安全。 ...下面是我的控制器示例: 下面是Void方法: 我怎么解决这个问题?

  • Shell 编程就像一个 1950 年代的自动点唱机… -- Larry Wall 在最简单的情况下,脚本程序不过是存储在一个文件里的系统命令列表。这至少让你执行它时不必重新按顺序键入相同功能的命令序列。 例子 2-1. cleanup: 一个清空/var/log目录下的日志文件的脚本 1 # Cleanup 2 # 必须以root用户运行. 3 4 cd /var/log

  • 我想在一个活动中打开不同的文章,使用我通过通知发送的不同帖子id。我可以点击通知打开一个帖子,但打开同一个活动后,我无法打开或处理第二个通知。 注意:我试过使用可以轻松打开所有通知,但当按下HOME(主页)按钮并从抽屉重新打开应用程序时,它会打开第一个通知,而不是最后一个打开的通知。 XML很简单`