C# Rest服务,在管道处理资源之前等待事件

C# Rest服务,在管道处理资源之前等待事件,c#,rest,events,async-await,.net-core,C#,Rest,Events,Async Await,.net Core,我有一个执行异步事件的通用rest服务。目前我正在使用它从信号集线器发送更新。我的通用服务实现如下所示: public event EventHandler<TDTO> OnCreate; protected virtual void OnCreated(TDTO dto) { OnCreate?.Invoke(this, dto); } public async Task<TDTO> Create(TDTO dto) { var entity = this.D

我有一个执行异步事件的通用rest服务。目前我正在使用它从信号集线器发送更新。我的通用服务实现如下所示:

public event EventHandler<TDTO> OnCreate;
protected virtual void OnCreated(TDTO dto) { OnCreate?.Invoke(this, dto); }

public async Task<TDTO> Create(TDTO dto)
{
    var entity = this.DtoToEntity(dto, new TEntity());
    this._context.Set<TEntity>().Add(entity);

    dto = await this.SaveEntity(entity);
    this.OnCreated(dto);
    return dto;
}
公共事件事件处理程序OnCreate;
受保护的虚拟void OnCreated(TDTO dto){OnCreate?.Invoke(this,dto);}
公共异步任务创建(TDTO dto)
{
var entity=this.DtoToEntity(dto,newtenty());
此._context.Set().Add(实体);
dto=等待此。保存实体(实体);
这个。一旦创建(dto);
返回dto;
}
我正在使用异步委托我正在订阅on create事件:

rs.OnCreate += async (object obj, MessageDTO dto) =>
{
    var context = sp.GetService<AstootContext>();
    var isFirstMessage = await context.Conversations.Where(x => x.Id == dto.ConversationId).Where(x => x.Messages.Count == 1).AnyAsync();

    if(isFirstMessage)
    {
        var hubContext = sp.GetService<IHubContext<CRUDServiceHubBase<Conversation>>>();
        var conversationService = sp.GetService<IRestEzService<Conversation, ConversationDTO>>();
        var conversationDTO = await conversationService.Get(new object[] { dto.ConversationId });
        await hubContext.Clients.All.SendAsync(CRUDServiceHubBase.CreateEventName, conversationDTO)
                        .ConfigureAwait(false);      
    }
};
rs.OnCreate+=async(objectobj,MessageDTO-dto)=>
{
var context=sp.GetService();
var isFirstMessage=wait context.Conversations.Where(x=>x.Id==dto.ConversationId).Where(x=>x.Messages.Count==1.AnyAsync();
if(isFirstMessage)
{
var hubContext=sp.GetService();
var conversationService=sp.GetService();
var conversationDTO=await conversationService.Get(新对象[]{dto.ConversationId});
等待hubContext.Clients.All.SendAsync(CRUDServiceHubBase.CreateEventName,conversationDTO)
.配置等待(错误);
}
};
然而,我得到了一个错误,当我等待conversationService.Get时,Http管道在我的事件完成之前关闭

我不想更改为使用观察者模式,因为这将导致破坏性更改

我想继续使用async来释放线程,用于网络操作等


如何确保管道在处理资源之前等待事件完成

因为您没有等待
OnCreated
Create
可能会在
OnCreated
完成执行之前返回

您可能需要修改设计,因为这需要抛出OnCreated的调用列表,并等待所有委托的执行结果