2015-09-09 18 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个事件。

希望这会有所帮助!