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

时间:2017-05-26 13:41:15

标签: .net masstransit

以下代码只是崩溃应用程序,没有捕获错误,应用程序只是在调用发布时关闭。 我真正想做的是执行单元测试,这个代码只是抽象的,以提供一个干净的例子。当我将相应的代码作为单元测试运行时,我得到一个错误消息,说该线程正在中止。该代码使用的是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");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

为了正确等待异步方法,它必须返回Task。由于您返回void,因此无需等待线程处理。这与MassTransit无关,只是常规的async / await事件。

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

简化通话

根据单元测试,您可以使用总线线束来测试您的消费者,就像它显示here一样。文档滞后,但它即将到来。