Mediatr - 如何使用单个数据库实体处理异步通知,C#

问题描述 投票:0回答:0

我有一个事件,当用户在页面上看到一些 html 块时触发,如果有多个 html 块 - 几乎同时触发多个事件。 我有一个处理程序来处理事件:

using MediatR;

public class EventHandler : INotificationHandler<BlockAccessedEvent> {
    
    public async Task Handle(BlockAccessedEvent request, CancellationToken cancellationToken)
    {
            var session = await GetOrCreateLearningSession(cancellationToken);
            session.BlocksVisited++;
            session.AddEvent(LearningSessionEventType.BlockVisited, request.BlockId);

            await unitOfWork.SaveEntityChangesAsync(cancellationToken);
    }
}

我需要保存到db的是每个事件和事件的总和。所以结果应该是这样的:

会议桌

Id      BlocksVisited
1       2

活动表

Id SessionId  EventType
1  1          BlockVisited
2  1          BlockVisited

但我的问题是处理同时触发的多个事件,因此由于任务在调用 Handle() 方法时异步运行,因此在上一个任务保存更改之前检索会话,因此对于 BlocksVisited 列,取值为 1共 2 张:

会议桌

Id      BlocksVisited
1       1

有没有办法让 Mediatr 通知处理程序成为单例?这样

session
将与 EF 上下文中的实例相同? 我会很感激任何帮助。

c# .net multithreading .net-core multitasking
© www.soinside.com 2019 - 2024. All rights reserved.