在 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。文档落后了,但它来了。
以下代码只是使应用程序崩溃,没有发现任何错误,应用程序在调用 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。文档落后了,但它来了。