我正在尝试将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
”而应用程序因为这些请求而卡住了。< / p>
无论如何,我可以在不阻塞线程的情况下使应用程序响应。
编辑:当前已应用Parallel.Invoke
并且没有丢失单个消息,应用程序也响应,但发送量大幅下降到2-3条消息/秒
我应该切换到多线程模型而不是使用Async。找到了这样的模拟问题Is async HttpClient from .Net 4.5 a bad choice for intensive load applications?