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

.net 在CreateUsingInMemory总线崩溃应用程序上发布,.net,masstransit,.net,Masstransit,下面的代码会使应用程序崩溃,不会捕获任何错误,并且在调用Publish时应用程序会简单地关闭。 我真正想做的是执行单元测试,这段代码只是为了提供一个清晰的示例而进行的抽象。当我将相应的代码作为单元测试运行时,会收到一条错误消息,表明线程正在中止。代码使用的是MassTransit nuget包的3.5.6版 有人能看出我做错了什么吗 using System; using System.Threading.Tasks; using MassTransit; namespace Customer

下面的代码会使应用程序崩溃,不会捕获任何错误,并且在调用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");
        }
    }
}
使用系统;
使用System.Threading.Tasks;
使用大众运输;
名称空间CustomerService.Console
{
班级计划
{
公共静态void Main(字符串[]args)
{
Task.Run(()=>performmasstTransitTest()).GetAwaiter().GetResult();
}
公共静态异步void PerformAssessTransitTest()
{
var busControl=Bus.Factory.CreateUsingInMemory(配置=>
{
config.ReceiveEndpoint(“myQueue”,endpoint=>{endpoint.Consumer();});
});
尝试
{
等待busControl.StartAsync();
等待busControl.Publish(newtestmessage());
System.Console.ReadKey();
}
捕获(异常错误)
{
系统控制台写入线(错误);
}
System.Console.ReadLine();
}
}
公共类测试消息
{
}
公共类TestMessageConsumer:IConsumer
{
公共任务消费(消费上下文)
{
系统控制台写入线(“消费”);
返回Task.FromResult(“已消耗”);
}
}
}

为了正确等待异步方法,它必须返回
任务
。由于您返回了
void
,因此没有什么可等待的,因此线程将被释放。这与MassTransit无关,只是常规的异步/等待

当您更改返回任务的方法时,可以使用
TaskUtil.Await(()=>performmasstTransitTest())简化调用


根据单元测试,您可以使用总线线束测试耗电元件,如图所示。文档落后了,但即将发布。

谢谢你,太好了,有时候你看不到森林里所有的树:)效果很好@如果你能接受并投票表决,那就太好了:)