gpt4 book ai didi

c# - MediatR 会顺序运行命令还是并行运行命令?

转载 作者:行者123 更新时间:2023-12-05 05:07:39 31 4
gpt4 key购买 nike

我在应用程序中使用 MediatR 和 CQRS。以下两条语句存在于很多模块中,在应用程序中可能会被并发调用(这是一个blazor应用程序)。

await Mediator.Send(new AddIdCommand { Id = id });

await Mediator.Send(new DeleteIdCommand { Id = id });

以下是更新同一个文本文件的命令。

public class AddIdCommand : IRequest
{
public int Id { get; set; }

public class AddIdCommandHandler : IRequestHandler<DeleteIdCommand>
{
public async Task<Unit> Handle(AddIdCommand request, CancellationToken cancellationToken)
{
// .... update the text file with the Id deleted
}
}
}

public class DeleteIdCommand : IRequest
{
public int Id { get; set; }

public class DeleteIdCommandHandler : IRequestHandler<DeleteIdCommand>
{
public async Task<Unit> Handle(DeleteIdCommand request, CancellationToken cancellationToken)
{
// .... update the text file with the Id added
}
}
}

....
protected IMediator Mediator => _mediator ??= HttpContext.RequestServices.GetService<IMediator>();

这两个命令中的Handle(...)会一直按顺序调用吗? (所以不用担心多个进程更新同一个文件的问题。)

最佳答案

好吧,仅从这两行的上下文来看:

await Mediator.Send(new AddIdCommand { Id = id });
await Mediator.Send(new DeleteIdCommand { Id = id });

它将按顺序运行。

你可以在这里看到代码:

https://github.com/jbogard/MediatR/blob/master/src/MediatR/Mediator.cs

var requestType = request.GetType();

var handler = (RequestHandlerWrapper<TResponse>)_requestHandlers.GetOrAdd(requestType,
t => Activator.CreateInstance(typeof(RequestHandlerWrapperImpl<,>).MakeGenericType(requestType, typeof(TResponse))));

return handler.Handle(request, cancellationToken, _serviceFactory);

它只是返回异步处理方法的任务。因此,如果您等待后续的句柄方法,它会同步运行(相对于彼此)。

但是你用

结束你的问题

So no need to worry about multiple processes updating the same file issue.

我不确定。即使您正在等待两种发送方法,如果有两个独立的进程调用这两种方法,并且它们都针对同一个文件,则无法保证它们之间的顺序。Mediator.cs 为多线程应用程序所做的唯一同步是 _requestHandlers 是一个 ConcurrentDictionary。

因此它保证这一行永远不会为同一类型初始化多个处理程序,即使是并行调用也是如此:

var handler = (RequestHandlerWrapper<TResponse>)_requestHandlers.GetOrAdd(requestType,
t => Activator.CreateInstance(typeof(RequestHandlerWrapperImpl<,>).MakeGenericType(requestType, typeof(TResponse))));

Handle 调用不同步。

关于c# - MediatR 会顺序运行命令还是并行运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58947505/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com