2010-05-28 64 views
2

假設我們正在構建一些抓取用戶設置(他想要執行呼叫的服務器,用戶和密碼)的公共服務,登錄到該服務器以及做一些處理...在短時間內運行一次1000次的方法

  • 過程大約需要15秒才能完成
  • 每個用戶都有不同的設置(服務器/用戶/密碼),因此過程中需要對每一個
運行

如果1000個用戶告訴系統運行在1:00 PM

我怎麼能保證,該方法是在接下來的15分鐘處理的方法是什麼?

什麼應該是正確的方法來解決這個小問題?

我在想我需要異步執行某些操作,並行處理可能會加快速度,可能會限制進程,可能每30秒執行100次調用?

我從來沒有像這樣,很想得到的想法和未來的問題只花100個小時的工作,並認識到我採取了錯誤的道路:(

謝謝您的反饋意見。


添加

唯一需要考慮的是這應該是100%的網絡解決方案。

回答

1

如果對您的方法的一次調用不影響另一個方法調用的結果(這似乎是這裏的情況),並行編程似乎是要走的路。

考慮的不是在asp.net應用程序直接處理這個,而是放置在一個隊列這樣的要求,並具有另一個進程(Windows服務可能是一個很好的候選這裏)拉項目從隊列中進行處理。 Windows服務可以有多個線程,並且可以一次從隊列中拉出儘可能多的項目,因爲正在處理可用的線程。通過適當的排隊機制,如果需要達到性能目標,Windows服務可以在單獨的硬件上運行。

您可以讓原始網頁查詢結果,例如, Ajax提供用戶反饋,如果這是一個要求。

UPDATE:

微軟recommended a pattern對於可在託管環境中使用長時間運行的任務。

+0

沒有要求,因爲這是用於自動化解決方案,但是您告訴我要運行Windows服務,所以我不能只在Web服務器(託管)中執行此操作,對吧? :-( – balexandre 2010-05-28 16:59:44

+0

@balexandre:更新了我的回覆,其中包含一個Microsoft推薦的模式,該模式可以在託管環境中工作,與我的建議非常相似,不同之處在於您使用單獨的Web服務而不是Windows服務,運行過程。 – 2010-05-28 18:13:28

1

那麼,1000 * 15秒是超過4小時,所以你只能在15分鐘的時間內完成整個任務,如果你並行的批次。

我會設置一個隊列並有足夠數量的線程或進程從該隊列中拉出。

您可以使用Queue<T>或帶有數據庫表或MSMQ的進程外進程定義進程內隊列。

如果您不想編寫多線程代碼,那麼您可以在不同的機器上運行一堆不同的進程,這些進程都從同一個隊列中提取。

控制檯應用程序可以做到這一點,但Windows服務絕對也是一種選擇。