【发布时间】:2015-09-09 09:33:43
【问题描述】:
我正在尝试将音频文件 (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?
【问题讨论】:
-
Parallel.Invoke是多线程的... ?? -
不,不是那样,
-
请阅读the documentation on
Parallel.Invoke:可能并行执行每个提供的操作。 -
哈哈,可能是....实际上我正在尝试在 eventthub 上发送麦克风数据。当麦克风被激活时,我不是在等待它写入文件,而是自定义实现的 writeasync 并在我得到它们后立即发送字节。
-
只有我试图避免写入一次又一次转换为字节。是的,事件中心也有 64K 大小限制
标签: c# async-await iot azure-eventhub