2017-05-26 58 views
0

以下代码仅会使应用程序崩溃,在调用发布时,不会发生错误并且应用程序会关闭。 我真正想做的是执行unittests,这段代码只是为了提供一个干净的例子的摘要。当我将相应的代码作为unittest运行时,我收到一条错误消息,指出线程正在中止。代码使用的是MassTransit nuget包的3.5.6版本。发布于CreateUsingInMemory总线崩溃应用程序

任何人都可以看到我做错了什么?

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"); 
     } 
    } 
} 

回答

0

为了让您的异步方法要正确期待已久的,它必须返回Task。既然你返回void,没有什么可以等待,所以线程被处置。这与MassTransit无关,只是常规的异步/等待事情。

当你改变你的方法返回的任务,您可以通过使用TaskUtil.Await(() => PerformMassTransitTest());

按单元测试简化呼叫时,您可以使用公交车线束,以测试你的消费者,就像它显示here。文件滞后,但即将到来。

+0

谢谢你,完美,有时你没有看到所有树木的森林:)工程就像一个魅力! –

+0

@MorganArvander这将是很好,如果你可以接受并upvote答案:) –