Bootstrap

MediatR 使用记录-发布订阅运行机制测试

注意:mediatR发布-订阅,订阅方是多个的时候是串行的,一个执行完才执行下一个

// 发送部分代码
  Console.WriteLine($"{DateTime.Now}-发送开始-");
  mediator.Publish<TestEvent>(new TestEvent("nancy"));
  Console.WriteLine($"{DateTime.Now}-发送完毕-");

订阅方-串行执行代码如下:

//订阅方1的代码
public class TestEventHandler1 : INotificationHandler<TestEvent>
{
    public Task Handle(TestEvent notification, CancellationToken cancellationToken)
    {
          return Task.Run(async () =>
          {
              Console.WriteLine($"{DateTime.Now}-TestEventHandler1 我收到了{notification.UserName}");
              await Task.Delay(5000);
              Console.WriteLine($"{DateTime.Now}-TestEventHandler1 -结束");
          });
        //return Task.CompletedTask;

    }
}
//订阅方2的代码
 public class TestEventHandler2 : INotificationHandler<TestEvent>
 {
     public Task Handle(TestEvent notification, CancellationToken cancellationToken)
     {
         return Task.Run(async () =>
        {
            Console.WriteLine($"{DateTime.Now}-TestEventHandler2 我收到了{notification.UserName}");
            await Task.Delay(5000);
            Console.WriteLine($"{DateTime.Now}-TestEventHandler2 -结束");
        });

         //return Task.CompletedTask;
     }
 }
 //订阅方3的代码
  public class TestEventHandler3 : INotificationHandler<TestEvent>
 {
     public Task Handle(TestEvent notification, CancellationToken cancellationToken)
     {
         return  Task.Run(async () =>
         {
             Console.WriteLine($"{DateTime.Now}-TestEventHandler3 我收到了{notification.UserName}");
             await Task.Delay(5000);
             Console.WriteLine($"{DateTime.Now}-TestEventHandler3 -结束");
         });

         //return Task.CompletedTask;
     }
 }

运行结果:
在这里插入图片描述
通过以下方式改为并行:
需在task.run之后 return Task.CompletedTask;直接ruturn task.run 可能框架会await,会等待task.run 内的代码执行完毕后才返回,失去了异步的目的

订阅方-并行执行代码如下:

 public class TestEventHandler1 : INotificationHandler<TestEvent>
 {
     public Task Handle(TestEvent notification, CancellationToken cancellationToken)
     {
             Task.Run(async () =>
           {
               Console.WriteLine($"{DateTime.Now}-TestEventHandler1 我收到了{notification.UserName}");
               await Task.Delay(5000);
               Console.WriteLine($"{DateTime.Now}-TestEventHandler1 -结束");
           });
         return Task.CompletedTask;

     }
 }
  public class TestEventHandler2 : INotificationHandler<TestEvent>
 {
     public Task Handle(TestEvent notification, CancellationToken cancellationToken)
     {
           Task.Run(async () =>
        {
            Console.WriteLine($"{DateTime.Now}-TestEventHandler2 我收到了{notification.UserName}");
            await Task.Delay(5000);
            Console.WriteLine($"{DateTime.Now}-TestEventHandler2 -结束");
        });

         return Task.CompletedTask;
     }
 }
 public class TestEventHandler3 : INotificationHandler<TestEvent>
{
    public Task Handle(TestEvent notification, CancellationToken cancellationToken)
    {
           Task.Run(async () =>
        {
            Console.WriteLine($"{DateTime.Now}-TestEventHandler3 我收到了{notification.UserName}");
            await Task.Delay(5000);
            Console.WriteLine($"{DateTime.Now}-TestEventHandler3 -结束");
        });

        return Task.CompletedTask;
    }

运行结果:
在这里插入图片描述

;