c# - 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.Get
Http 管道在我的事件完成之前关闭。
我不想更改为使用观察者模式,因为这会导致重大更改。
我想继续使用异步来释放我的线程,用于网络操作等。
如何确保管道在处理我的资源之前等待我的事件完成?
解决方案
因为您在完成执行之前没有等待OnCreated
可能返回Create
。OnCreated
您可能想要修改您的设计,因为这将需要抛出调用列表OnCreated
并等待所有委托的执行结果。
推荐阅读
- node.js - 为什么 'npm start' 不能在带有 Node server.js 端口 :::3131 的浏览器中运行项目?(JavaScript 项目)
- python - “typed=False”是什么意思?
- unix - 如何根据 Unix 中特定字段的特定字符过滤数据?
- keyboard - Arch Linux 安装键盘布局 de-latin1 在 /etc/vconsole.conf
- redis - Redis 写入日志并查看日志
- jupyter-notebook - Jupyter nonotebook:我可以将代码单元标记为不执行(跳过代码单元)吗?
- linux - G++ 链接器阶段失败,但库中的符号
- laravel - Laravel 灯塔 JSON 类型
- google-cloud-platform - Google Cloud Spanner 请求在其他项目上启用
- python - 将多个 Django 模型导出到一个文件中