C# 具有EventHub和Async的请求突发模式
我正在尝试将音频文件(C# 具有EventHub和Async的请求突发模式,c#,async-await,iot,azure-eventhub,C#,Async Await,Iot,Azure Eventhub,我正在尝试将音频文件(wav)从IoT设备发送到Eventhub。由于Eventhub对每条消息的大小限制为64Kb,因此每条消息被分块成一个7kb字节数组并发送到Eventhub。我正试图从客户端获得最大发送速率[不超过阈值] 录制现场音频,将其保存在文件流中,并将其分块发送。我使用自定义流实现避免了这一部分 public class CustomAudioStream : IRandomAccessStream{ public IAsyncOperationWithProgress&
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;
}
}
});
});
}
}
我不想等待任务完成,也不想等待任务的结果。但当我这样做时,我的大多数请求都会被“请求超时”
,应用程序会因为这些请求而被卡住
不管怎样,我都可以在不阻塞线程的情况下使应用程序响应
编辑:当前应用的
并行。调用并不会丢失一条消息,应用程序也会响应,但发送速度会急剧下降到每秒2-3条消息
我应该切换到多线程模型而不是使用异步。发现类似这样的问题您正被azure eventhub限制。计算总进出量并选择所需的吞吐量
每个吞吐量单元具有以下功能:1 MB/s入口、2 MB/s出口和高达84 GB的事件存储。转到service bus命名空间中的scale选项卡,并根据需要增加吞吐量单位。
我想,“请求超时”并不一定意味着你被限制了。我将查找detail属性并检查错误代码。如果将50002视为错误代码,则意味着您已被限制,并且可能会根据需要增加TU。仅供参考,单个TU每秒最多支持1000个事件
希望这有帮助 Parallel.Invoke
是多线程的吗??不,不是这样的,请阅读:执行每个提供的操作,可能是并行的。哈哈,可能是。。。。实际上,我正在尝试在eventhub上发送麦克风数据。当麦克风被激活时,我并不是在等待它写入文件,而是一个自定义实现的writeasync,并在收到它们后立即发送字节。只是我试图避免写入一次又一次地转换为字节。是的,活动中心也有64K大小的限制
Task.Factory.StartNew(()=>{
BackgroundSender(byte[data]);
});