c# - 使用 EventHub 和异步的突发请求模式

标签 c# async-await iot azure-eventhub

我正在尝试将音频文件 (wav) 从 IoT 设备发送到 Eventhub。由于 Eventhub 有每条消息 64Kb 的大小限制,每条消息被分块到一个 7kb 字节数组并发送到 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]);
        });

我不想等待任务完成任务的结果。但是当我这样做时,我的大部分请求都得到“Request Timed out”并且应用程序卡住了,因为这些要求。

无论如何我可以在不阻塞线程的情况下使应用程序响应。


编辑:当前应用Parallel.Invoke 并且没有丢失一条消息,应用程序也有响应,但发送速度急剧下降到 2-3 条消息/秒

我应该切换到多线程模型而不是使用异步。找到类似这样的问题 Is async HttpClient from .Net 4.5 a bad choice for intensive load applications?

最佳答案

您正受到 azure eventhub 的限制。计算您的总入口和导出并选择所需的吞吐量。

每个吞吐量单位都具有以下功能:1 MB/s 入口、2 MB/s 导出和高达 84 GB 的事件存储。转到服务总线命名空间中的缩放选项卡,并根据需要增加吞吐量单位。 enter image description here

关于c# - 使用 EventHub 和异步的突发请求模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32475983/

相关文章:

c# - 使用多线程暴力破解密码

C# 如何等待返回 Task<dynamic> 的方法?

angularjs - 将 Protractor 测试移至 async/await(留下 selenium 控制流)

azure - Microsoft Azure IoT 中心是否存储数据?

c# - 这是否容易受到注入(inject)攻击

c# - 有没有更简单的方法为 C# 中的方法创建重载?

vb.net - 如何在 Pi 上显示来自 USB 的随机图像

arduino - 如何删除SIM800l中的所有短信?

c# - 为什么要使用 decimal(int [ ]) 构造函数?

javascript - 如何确保Jest bootstrap文件首先运行?