2017-05-26 1 views
0

次のコードはアプリケーションをクラッシュさせ、エラーは検出されず、を呼び出すとアプリケーションは単にシャットダウンします。 私が実際にやろうとしているのは、単体テストを実行することです。このコードは、きれいな例を提供するための抽象的なものです。対応するコードをunittestとして実行すると、スレッドが異常終了しているというエラーメッセージが表示されます。このコードは、MassTransitナゲットパッケージのバージョン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とは関係なく、通常の非同期/待機のものです。タスクを返すためにあなたの方法を変更すると

、あなたはそれがhere示されているようにあなたは、あなたの消費者をテストするために、バスのハーネスを使用することができ、ユニットテストを1としてTaskUtil.Await(() => PerformMassTransitTest());

を使用してコールを簡素化することができます。ドキュメントは遅れているが、それは来ている。

+0

ありがとう、完璧な、時々あなたはすべての木のために森を見ない:)魅力のように動作します! –

+0

@MorganArvander答えを受け取ってupvoteすることができればいいです:) –

関連する問題