首页 > 解决方案 > Rest Service,在 Pipeline 释放资源之前等待事件

问题描述

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

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;
}

我正在使用订阅 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);      
    }
};

但是我收到一个错误,当我await conversationService.GetHttp 管道在我的事件完成之前关闭。

我不想更改为使用观察者模式,因为这会导致重大更改。

我想继续使用异步来释放我的线程,用于网络操作等。

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

标签: c#resteventsasync-await.net-core

解决方案


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

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


推荐阅读