我正在尝试将音频文件 (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 的事件存储。转到服务总线命名空间中的缩放选项卡,并根据需要增加吞吐量单位。
关于c# - 使用 EventHub 和异步的突发请求模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32475983/