我有一个通用的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管道在事件完成之前关闭了。
我不想更改为使用观察者模式,因为这将导致重大更改。
我想继续使用异步来释放线程,进行网络操作等。
在处置资源之前,如何确保管道等待事件完成?
答案 0 :(得分:1)
因为您没有等待OnCreated
,所以Create
可能会在OnCreated
完成执行之前返回。
您可能需要修改设计,因为这将需要抛出OnCreated
的调用列表,并等待所有委托执行的结果。