在 CreateUsingInMemory 总线上发布使应用程序崩溃

Publish on CreateUsingInMemory bus crashes application

以下代码只是使应用程序崩溃,没有发现任何错误,应用程序在调用 Publish 时只是简单地关闭了。 我真正想做的是执行单元测试,这段代码只是为了提供一个干净的例子的抽象。当我 运行 相应的代码作为单元测试时,我收到一条错误消息,指出线程正在中止。该代码使用的是 MassTransit nuget 包的 3.5.6 版。

谁能看出我做错了什么?

using System;
using System.Threading.Tasks;
using MassTransit;

namespace CustomerService.Console
{
    class Program
    {
        public static void Main(string[] args)
        {
            Task.Run(() => PerformMassTransitTest()).GetAwaiter().GetResult();

        }

        public static async void PerformMassTransitTest()
        {
            var busControl = Bus.Factory.CreateUsingInMemory(config =>
            {
                config.ReceiveEndpoint("myQueue", endpoint => { endpoint.Consumer<TestMessageConsumeer>(); });
            });

            try
            {
                await busControl.StartAsync();
                await busControl.Publish(new TestMessage());
                System.Console.ReadKey();
            }
            catch (Exception err)
            {
                System.Console.WriteLine(err);
            }
            System.Console.ReadLine();
        }
    }

    public class TestMessage
    {
    }

    public class TestMessageConsumeer : IConsumer<TestMessage>
    {
        public Task Consume(ConsumeContext<TestMessage> context)
        {
            System.Console.WriteLine("Consuming");
            return Task.FromResult("Consumeed");
        }
    }
}

为了正确等待您的异步方法,它必须 return Task。因为你 return void,没有什么可等待的,所以线程被处理掉了。这与 MassTransit 无关,只是常规 async/await 事情。

当您将方法更改为 return 任务时,您可以使用 TaskUtil.Await(() => PerformMassTransitTest());

简化调用

根据单元测试,您可以使用总线线束来测试您的消费者,如图所示 here。文档落后了,但它来了。