我正在使用WebClient類和我自己的薄包裝器來請求JSON over HTML - 我在Comet-like體系結構的接收端,因此客戶端需要始終保持待處理請求的打開狀態,以便服務器可以隨意推送給客戶端。如何在超時或響應後不斷打開WebClient請求
我想確認下面的代碼是否有必要做一個正確的和安全的方式:
subscriber = new Action(() =>
{
// This function wraps the WebClient 'DownloadStringAsync' method
client.BeginDownload(this.Path, new AsyncCallback(x =>
{
var data = (x.AsyncState as Func<JsonResponse>).EndInvoke(x);
if (data != null)
{
OnReceive(data, new Uri(this.FullUri));
}
subscriber(); // Received data so re-submit request
}), this.QueryArgs);
while (client.IsBusy)// As long as busy, no need to re-submit a request
{
}
subscriber();
});
subscriber();
從我自己的分析,它看起來對我來說,上面將確保客戶總是重新或者在a)收到答覆或b)超時時提交請求。這是一個可以接受的方式來達到這個目標嗎?還是有更好的做法,我錯過了?以這種方式使用while循環對我來說似乎並不標準,但我想不出任何其他方式來創建一個等待循環。
我也想確保我不會泄漏任何資源與此設置,因爲它可能會或可能不會保證EndInvoke()每次都被調用?
這不會在技術上破壞任何東西,但while循環會將單個CPU內核旋轉到100%,直到發生故障。你應該在那裏有一個簡短的Thread.Sleep,即使它只有1ms。 –
也許看看SignalR –
正如Michael Yoon所說,爲了不讓CPU飽和,我會給出至少5ms的睡眠時間,然後再發送另一個請求。此外,我不會從服務器返回一段時間。這樣,我可以確保在等待期間獲得一些數據時,我立即用數據返回客戶端。 – Muthu