2016-05-18 71 views
1

我的操作只返回一個帶有信息的JSON字符串。Task.Delay可以安全地在ASP.NET中使用嗎?

爲了防止用戶編輯每2秒鐘更新信息的JS代碼,我還需要一個服務器端延遲來防止CPU負載過高。

如果有(例如)2000-5000個用戶同時做同樣的請求,使用Task.Delay(2000)有多安全?每個用戶返回的信息都不相同。

+0

我不完全瞭解你想實現什麼,但爲什麼不使用某種隊列並通過定時器執行操作? –

+0

@KonstantinPeshekhonov IIS已經使用隊列,支持調節*和緩存結果。沒有必要重新創建它們 –

+0

@AlkKsk你描述的並不是一個很高的請求負載。 HTTP,IIS和ASP.NET都有辦法處理緩存響應。您可以將輸出緩存用於各個用戶的響應,例如2秒的小超時。您可以指定正確的標頭,以便IIS本身在適當的情況下返回緩存的響應(例如ETag,Expires)。您可以修改您的客戶端,使其只需要「If-Modified-Since」頭或「If-None-Match」和最後一個ETag請求更新版本。 –

回答

2

Task.Delay是完全安全的使用,因爲它不涉及創建或阻塞線程或它不會停止CPU。

另一方面,它不會幫助你,因爲它仍然可以從一臺機器執行多個請求。延遲執行而無需進一步檢查是一種無用的方法來抑制請求。

1

如果它約爲Task.Delay,那麼是的,這很好。 Task.Delay導致帶有計時器的任務,該計時器在完成時(在計時器的回調中)將繼續該任務。考慮到它的工作方式,這並不會阻塞你的線程,也不會在另一個線程上執行,所以它看起來很好。您發佈的請求數量也不會很大。

但的確,我的答案更多的是關於在ASP.NET MVC中使用Task.Delay而不是您特定的場景,如果您需要更具體的答案,您需要詳細描述。

2

爲什麼你認爲加入Task.Delay(2000)會減少CPU負荷?如果你在T處有很高的CPU負載,加入Task.Delay(2000)只會將高CPU負載推遲到T + 2,這是完全無奈的。

快速解決方案是檢查UI端的提交頻率,如在網頁上,禁用提交按鈕並在幾秒鐘後再次啓用。但是由於可以修改前端腳本,因此可能會被欺騙。

更安全的解決方案是檢查服務器端的提交頻率,記錄最後一次提交的時間(例如靜態變量,最簡單),並拒絕無效請求。

0

除了asp.net中正確的其他答案,如果用戶使用asp.net會話,則存在一個問題,您必須知道這個問題,因爲asp.net會話鎖定了整個站點,直到致電退貨。

因此,如果您使用的延遲,與會話,你阻止所有用戶...請閱讀:

Does ASP.NET Web Forms prevent a double click submission?
Web app blocked while processing another web app on sharing same session
What perfmon counters are useful for identifying ASP.NET bottlenecks?
Replacing ASP.Net's session entirely
Trying to make Web Method Asynchronous

相關問題