2015-09-09 43 views
2

我想從IoT設備發送音頻文件(wav)到Eventhub。由於Eventhub的每個消息的大小限制爲64Kb,因此每個消息都被分塊爲7kb字節數組併發送至Eventhub。我正試圖從客戶端實現最大發送率[不超過閾值]突發模式的請求與EventHub和異步

錄製實時音頻,將其保存在文件流中並分塊發送。我避免這部分定製流實現

public class CustomAudioStream : IRandomAccessStream{ 
    public IAsyncOperationWithProgress<uint, uint> WriteAsync(IBuffer buffer) 
     { 
      return AsyncInfo.Run<uint, uint>((token, progress) => 
      { 
       return Task.Run(() => 
       { 
        using (var memoryStream = new MemoryStream()) 
        { 
         using (var outputStream = memoryStream.AsOutputStream()) 
         { 
          outputStream.WriteAsync(buffer).AsTask().Wait(); 

          var byteArray = memoryStream.ToArray(); 

          //bytes are ready to send from here 
          ChunkedEventSender(this, byteArray); 
#if DEBUG 
          Debug.WriteLine("Array Length: " + byteArray.Length + " MemoryStream length:" + memoryStream.Length); 
#endif 
          return (uint)memoryStream.Length; 
         } 
        } 
       }); 
      }); 
     } 
    } 

但我不能夠以相同的速度在這裏與REST實現發送字節。發送我使用第三方包裝,所以我不能在那邊。

,但我可以跨越線程使應用程序響應,而互動,所以我使用

Task.Factory.StartNew(()=>{ 
      BackgroundSender(byte[data]); 
     }); 

我不想等到任務完成Task.but既不結果當我做到這一點大部分我的請求正在變得「Request Timed out」,並且Application因爲這些請求而陷入困境。

無論如何,我可以讓應用程序響應而不會阻塞線程。


編輯:目前應用Parallel.Invoke而不是鬆散單信息和應用也響應,但大幅下降發送到2-3消息/秒

我應該切換到多線程模式,而不是使用異步。找到Simlar這樣的問題Is async HttpClient from .Net 4.5 a bad choice for intensive load applications?

+0

'Parallel.Invoke'是多線程...... ?? –

+0

沒有它那樣, – joshua

+0

請閱讀[Parallel.Invoke'文檔](https://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.invoke.aspx): *執行每個提供的動作,可能並行。* –

回答

0

你被azure eventhub扼殺。計算總入口和出口並選擇所需的吞吐量。

每個吞吐量單元都具有以下功能:1 MB/s入口,2 MB/s出口和高達84 GB的事件存儲。轉到服務總線命名空間的比例選項卡,並根據需要增加吞吐量單位。 enter image description here

0

「請求超時」並不一定意味着你被扼殺我猜。我會尋找細節屬性並檢查錯誤代碼。如果您看到50002作爲錯誤代碼,那麼這意味着您會受到限制,並且您可能會根據需要增加TU。僅供參考,單個TU支持每秒1000個事件。

希望這會有所幫助!