2016-06-27 1 views
1

私のapi(c#)では、私は現在、多くのリクエスト(15-20秒)に答えています。今私はいくつかの目的のためにイベントハブにデータを送信したい。しかし、私は紺碧のイベントハブにデータを送信するためにユーザーを遅らせたいとは思わない。だから私はイベントのハブbeacuseに非同期要求をする必要があります私のアプリは、私は答えを待っているユーザーを取得したいazureにデータを送信しています。私はできるだけ早く応答を送る必要があり、紺碧は2〜3秒続くことがあります。async azureイベントハブデータメソッドを送信します。

どのように成功することができますか? 私は何かをしたが、私が望むものを得られなかった。私のコード:

public static async Task<string> SendEvents(List<object> messages) 
{ 
    string eventHubName = "rcmds"; 

    var connectionString = GetServiceBusConnectionString(); 

    CreateEventHub(eventHubName, connectionString); 

    var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName); 

    try 
    { 
     List<Task> tasks = new List<Task>(); 

     for (int i = 0; i < messages.Count; i++) 
     { 
      var serializedMessage = JsonConvert.SerializeObject(messages[i]); 

      EventData data = new EventData(Encoding.UTF8.GetBytes(serializedMessage)); 

      // Mesajları Event Hub a yolla 
      tasks.Add(eventHubClient.SendAsync(data)); 
     } 

     Task.WaitAll(tasks.ToArray()); 
     System.Threading.Thread.Sleep(7000); 
    } 
    catch (Exception ex) 
    { 
     new ExceptionHandler(ex, "Event Hub Library Sender - SendEvents"); 
    } 
    finally 
    { 
     eventHubClient.CloseAsync().Wait(); 
    } 
    return ""; 
} 

と私の好きなこのメソッドを呼び出す:あなたが見ることができるように

static async void method() 


{ 
      List<object> list = new List<object>(); 
      list.Add("dogrudur"); 
      await Utilities.EventHub.Sender.SendEvents(list); 
     } 

、 "thread.sleed" コードがありますが、私は7秒待っていた:私は思う/

答えて

0

を良い方法でasync/awaitを実際に使用する方法についてもっと学ぶ必要があります。非同期コードとブロックコードを混在させています。背中の質問に、今

static async Task method() 
{ 
     List<object> list = new List<object>(); 
     list.Add("dogrudur"); 
     await Utilities.EventHub.Sender.SendEvents(list); 
    } 

public static async Task<string> SendEvents(List<object> messages) 
{ 
    string eventHubName = "rcmds"; 

    var connectionString = GetServiceBusConnectionString(); 

    CreateEventHub(eventHubName, connectionString); 

    var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName); 

    try 
    { 
     List<Task> tasks = new List<Task>(); 

     for (int i = 0; i < messages.Count; i++) 
     { 
      var serializedMessage = JsonConvert.SerializeObject(messages[i]); 

      EventData data = new EventData(Encoding.UTF8.GetBytes(serializedMessage)); 

      // Mesajları Event Hub a yolla 
      tasks.Add(eventHubClient.SendAsync(data)); 
     } 

     await Task.WhenAll(tasks.ToArray()); 
     System.Threading.Thread.Sleep(7000); 
    } 
    catch (Exception ex) 
    { 
     new ExceptionHandler(ex, "Event Hub Library Sender - SendEvents"); 
    } 
    finally 
    { 
     await eventHubClient.CloseAsync(); 
    } 

    return ""; 
} 

呼び出し元のコードは次のようになります。

正しいコードは次のようなものでなければなりません。現在のコードは、すべてのメッセージがイベントハブに送信され、7秒間スリープするまで待機します。メソッド呼び出しでは、SendEventsメソッドを待っているので、アプリケーションはイベントハブにデータを送信するのに必要な時間と7秒かかるでしょう。

あなたができることは、何らかの種類の防火と忘却の仕組みを実装することです。コード内でThread.Sleepを削除し、このような呼び出し方法変更:

static void method() 
{ 
    List<object> list = new List<object>(); 
    list.Add("dogrudur"); 
    Utilities.EventHub.Sender.SendEvents(list); 
} 

の方法は、もはや継続する前に待機していないだろうが、イベントの送信が完了すると、リターンであなたが知っていることはありません。一般的に、火災や忘却の方法は避けるべきです。

パフォーマンスを向上させるために行うことができるもう1つの重要なステップは、イベントをバッチで送信することです。現在、各イベントはeventHubClient.SendAsyncを使用して送信されますが、eventHubClient.SendBatchAsyncメソッド(https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.eventhubclient.sendbatchasync.aspx)もあります。したがって、小さなメッセージをたくさん送信する代わりに、複数のイベントを含むメッセージよりも少ないメッセージを送信できます。ただし、最大メッセージサイズがあることに注意してください。バッチを使用してイベントを送信するの実装例について

https://github.com/DeHeerSoftware/SemanticLogging.EventHub/blob/master/SemanticLogging.EventHub/EventHubAmqpSink.cs

このファイルの方法 private async Task SendAutoSizedBatchAsync(IEnumerable collection)参照
関連する問題