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



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

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

我正在使用异步委托,我正在订阅创建事件:

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 管道在我的事件完成之前关闭。

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

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

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

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

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

最新更新