休息服务,在管道处理资源之前等待事件

时间:2018-06-29 02:17:12

标签: 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.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.Get发生错误时,我的Http管道在事件完成之前关闭了。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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