2011-05-13 44 views
6

我的应用程序使用异步 HttpWebRequest请求预取大量视频帧。因此,如果有100个帧,预取器将 异步请求所有100个帧,一次请求,并在接收回时处理。 即它一次完成100次异步呼叫。这可能会使网络卡饱和,但这没关系。我想要最大化网络带宽。需要优先考虑异步套接字读取C#

但是,当这种预取正在发生时,用户可能想要查看其中一个帧。因此,假设他们想要查看第56帧。问题是,第1-100帧已经被请求,并且在管道中,所以对于第56帧的请求可能需要很长时间才能得到响应 。

如果有什么方法可以在异步请求完成后重新设置异步请求的优先级,那将会更好。并将用户请求推送到队列的前端。

如果我不能这样做,我想我将不得不批量请求帧,这样我可以在批次间滑入我的用户请求,并避免超时。

有关如何正确设计的任何想法将非常感激。

+0

+1,有趣的问题。我觉得链接不建议与一个异步请求交互,一旦它被解雇了,所以有点挫败了目的。 Rick,谢谢你, – 2011-05-13 03:17:03

回答

0

啊,我会用一个优先队列或堆来处理帧的“包”。既然你不想超时,并且你也想要速度,创建帧数据包(大小为2的幂),并将它们与优先级相关联(也许0表示未请求,1表示用户请求?)。这种方式最高优先级的数据包(用户请求)将始终位于队列的前端或堆顶部。

1

这不是一个编程问题,而是一个协议问题。如果你使用一个贪婪的协议使电线饱和,那么你甚至可以使用传统的协议来关闭你自己的选项。

如果您为第二个通道预留了一部分带宽,则可以将第二个通道用于各个帧而不是批量帧。要在存在饱和NIC的情况下为第二个通道中的帧分配优先级,您需要服务质量或其他链路层来优先处理流量。

但我们正在超越自我。如果你想要一个性能良好的功能性应用程序,你需要坐下来,根据协议专家的建议定义一个真正的协议:NIC,交换机,协议,数据包大小,重试等等。一旦你把所有的东西都整理出来,那么你就会拥有一个编程问题。

+0

谢谢。我希望我能够奢侈地设计我自己的协议!不幸的是,我需要通过http进行攻击。 – Jacko 2011-05-13 17:32:03

+0

@Jacko:那么你不能那么贪婪!如果你向工厂发出了一百个订单,你不能取消,然后你急需一个特别的订单,那么除非你可以优先考虑,否则你是不走运的。所以你需要更加小心地下订单。 – 2011-05-13 17:37:34