2012-09-22 100 views
0

我讀這個博客Easy Background Tasks的一些頁面的徽章系統,稱爲計算器:P,所以,在註釋中說,他們與執行任務的服務結束了,但例如:線程VS定時器VS服務

用戶在時間T1 這個動作取決於用戶 的X個動作時間T2後,您需要執行一些數據庫查詢,並通知用戶(電子郵件或其他)

我這樣說是因爲實時體驗,所以這裏的問題是,如果你使用線程,假設你有1000個用戶執行動作,你將有1000個等待線程,所以在一段時間內,會有reci clyng,或者如果服務器由於某種原因關閉,您將失去所有這些任務。使用計時器將以相同的情況結束

如果您使用服務,您將失去實時體驗,例如在線遊戲中。

那麼,如何處理這種東西呢?

+3

只有在時序不重要時才使用「後臺任務」。當然,如果是徽章,那麼當徽章遲到一分鐘後,沒有人會抱怨。如果「實時」對你很重要,那麼不要考慮後臺任務。而**從不**編寫創建一千個等待線程的代碼。 –

+0

那麼我不會抱怨,如果在下一個小時內頒發徽章,例如。所以,線程在這裏不是一個選項,因爲我需要創建它們的一千個,所以你有什麼建議嗎?例如,一個檢查這個小時的服務? –

回答

3

使用線程和信號時應該小心。 解決方案取決於場景的細節,但其中一種可擴展的解決方案是輪詢

根據您的方案,線程之間的信號傳輸效率並不高,因爲線程池中的可用線程數量始終有限。但是,如果您知道將擁有線程的最大用戶數(取決於遊戲設計),則可以使用WaitHandles(AutoResetEvent和/或ManualResetEvent)的信號在線程之間發送信號。但要確保你已經增加可用線程的數量在游泳池中的Global.asax中

  int availableThreads; 

      int availablePorts; 

      ThreadPool.GetAvailableThreads(out availableThreads, out availablePorts); 

      ThreadPool.SetMinThreads(availableThreads, availablePorts); 

的Application_Start事件希望它幫助。

+0

一個thead池聽起來像一個非常好的選擇,但我需要從每個用戶創建N個線程,所以我的線程數將是每個用戶的線程總數。那麼,你應該怎樣使用線程池呢? –

+0

我建議你考慮給每個用戶添加一個計時器和一個散列表(用於收集用戶特定的數據)。使用線程總是有限制的。可用線程的最大數量可以通過以下公式計算:Max_Available_Threads = 250 * [No_CPU_CORE],因此如果您在12核心cpu機器上運行,您將擁有多達3000個可用線程。所以基於這個數字,使用線程並不適合遊戲中的大量用戶。 – Houman

+0

謝謝你的回答;) –