2010-11-10 49 views
11

雖然通過我們的項目代碼,我碰到,在它結束了這段代碼的Web方法傳來:爲什麼不使用的Thread.Sleep沒有理由,並解釋給程序員

thread.sleep(6000); 
return true; 

現在,這樣做是爲了讓來自客戶端的jQuery ajax調用得到延遲,並且ajax動畫將顯示更長的時間。

這在我眼中是非常錯誤的。 UI和服務器端之間不應該有這種連接。如果他想要動畫花費更長時間,他可以在客戶端使用setTimeOut函數。

這是我的問題:我該如何向程序員解釋爲什麼這是錯誤的?不只是因爲客戶端/服務器的東西,但爲什麼要在網站上撥打thread.sleep

+0

我個人認爲你應該在[PR](http://programmers.stackexchange.com)上提出這個問題。 – Bobby 2010-11-10 13:22:25

+0

你是什麼意思? – 2010-11-10 13:23:07

+9

他必須非常自豪的動畫** ** **人觀看它6秒,而不是執行任何網站的用途。 – Brad 2010-11-10 13:24:45

回答

16

雖然延遲:

  • 您使用/阻塞線程
  • 你正在消耗內存的
  • 你有一個開放的TCP/IP連接

這些都是昂貴的資源上服務器

因爲:

  • 如果有其他請求進來,賠率更高,必須創建一個新的線程,所以這將使用CPU,內存等,這將延遲這個請求。 (轉到句子的開頭)。
  • 更多的內存消耗,意味着更多的頁面錯誤,更大的磁盤隊列。所有請求需要更長時間
  • TCP/IP連接是有限的資源。
2

由於網絡方法可能有多個消費者,並不是所有人都希望他們的數據延遲。

更新

好吧,但是也有工作線程在處理客戶端請求的池數量有限。你不想讓他們無所事事。延遲顯示數據是UI的功能,而不是提供數據的Web服務/頁面方法。你不會在你的數據訪問層中進行睡眠,你爲什麼要把它放在WebMethod中?

+0

很好..但是不夠好..這個隊友我喜歡爭論..我需要一個更好的解釋... – 2010-11-10 13:22:13

7

這將最終導致服務器上許多被阻塞的線程。
假設你有100個請求/秒,你有600個線程正在睡覺。
這些線程將在堆棧空間中使用1MB RAM,那麼您將浪費600MB的服務器RAM。

4

ROFL - 在服務器端實現動畫延遲:d

把延遲用的藉口「客戶需要的是延遲」使得該方法的客戶感知。這是一種氣味。從某種意義上說,它也違反了SRP - 因爲現在方法做了兩件事(做了一些有用的事情並延遲了時間),如果你想保持睡眠狀態,你必須在名稱中註明它,例如:DoSomethingUsefulAndDelayToo()

但對我來說,「方法應該是主叫不可知的」應該是主要觀點。

「我們需要延遲」的藉口違反了關注原則的分離 - 從現在開始,您的方法不僅獲取數據,還受到表示邏輯(動畫)的污染。

此外,你可以引入延遲動畫隊列可以(而且應該)很容易地使用jQuery來完成。

原則是有原因的,根據經驗,違反原則的影響並不總是立即顯現在每一個案件中,但在大多數情況下,它會回來並追捕你。

如果他一直堅持,至少要把方法分解成兩個方法就是做「sleep(6000); return」現在這將是荒謬的。

2

我該如何向程序員解釋爲什麼這是錯誤的?

簡單。 Sleep()的使用是code smell。期。

相關問題