2011-05-13 55 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