我正在尝试将音频文件(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 条消息/秒
我应该切换到多线程模型而不是使用异步。发现类似这样的类似问题.Net 4.5 中的异步 HttpClient 对于密集负载应用程序来说是一个糟糕的选择吗?