2017-03-14 10 views
2

私はデータを送信するAzure EventHubを持っています。コンソールアプリケーション(フレームワーク4.6.1)で次のコードを使用すると、完全に実行されます。私はAsp.Netアプリケーションでそれを置けばAsp.NetサイトからEventHubにデータを送信する

 eventHubClient = EventHubClient.CreateFromConnectionString(myConnString); 

     Console.WriteLine("Client Created"); 

     var sender = eventHubClient.CreatePartitionSender("1"); 

     var message = $"Message"; 

     Console.WriteLine($"Sending message: {message}"); 
     var eventData = new EventData(Encoding.UTF8.GetBytes(message)); 

     if (!sender.SendAsync(eventData).Wait(TimeSpan.FromMilliseconds(10000))) 
     { 
      int a = 0; 
     } 

しかし、タイムアウトし、毎回それを(フレームワーク4.6.1をターゲット)のいずれかIIS-ExpressまたはIISで実行されています。

私はここで何が欠けていますか?

+0

なぜすべてのアイテムをPartion 1に強制していますか?私はこのアプローチを使用していますが、awaitを使用する非同期メソッドでは、10秒間待機すると疑わしいと思われます。削除します。 –

+0

@SimonW私は1つのパーティションに強制していませんが、これはサンプルコードでした。イベントを送信するパーティションが5つあります。待ちに関しては、それは「10秒待ち」ではなく、呼び出しのタイムアウトを提供します。 –

+0

10秒のタイムアウトを削除すると成功しますか?コントローラーなどの呼び出しでこれが呼び出されていますか?もしそうなら、コントローラのアクションは非同期で実行するように設定されていますか? –

答えて

1

Asp.Netアプリケーションで非同期コンテキストでasyncメソッドを使用すると、デッドロックのソートが発生するようです。

私の場合、タイムアウトしているかどうかを知る必要があるので、非同期に実行するだけではなく、async呼び出しが完了した後に必要な作業が失敗した場合と同様に完了しました。

これは、私はこれは私がタイムアウトだけでなく、成功の両方を処理することができます

Task.Run(() => 
{ 
    if (!sender.SendAsync(eventData).Wait(TimeSpan.FromMilliseconds(10000))) 
     { 
      int a = 0; 
     } 
}); 

をやったことです。残念ながら、のコールスタック全体をawaitを使用するようにすることはできませんでした。

TL; DR:ASP.NETアプリケーションで.Wait()を呼び出すと、デッドロックが発生する可能性があります。

関連する問題