2016-02-24 71 views
2

我工作的地方在ASP.NET的HttpHandler運行其自己的線程池,它加載自己的進程外的COM對象的實例的遺留應用程序。請求進入並將工作負載傳遞給這些COM對象,並在完成時返回結果。ASP.NET處理程序,手動線程和COM服務器

處理工作正常,你肯定看到了池正在工作,同時請求進來可靠地處理......只要池中的線程數保持在10和游泳池不繁忙的請求飽和。一旦池既沒有飽和COM請求,也沒有純ASP.NETHandler請求再次觸發ASP.NET管道,直到池釋放一個實例。

當我運行16個實例線程池,並與長期運行需要5秒鐘即可完成(等待)請求命中服務器,我可以清楚地看到10個實例得到加載了工作。除此之外的任何實例都不會被擊中。不僅如此,即使直接的處理程序請求不會觸及COM池也會在此時開始排隊。

更多信息:

  • COM池與MTA線程(STA,但不會改變任何東西)
  • COM對象創建的STA線程和進程外的EXE的
  • COM對象上執行(即沒有COM線程編組)
  • ASP.NET線程發信號通知池線程開始處理
  • 當前ASP.NET上下文被傳遞給池t hread
  • 在Windows 10上運行.NET 4.5
  • 測試臨

我使用自定義線程池的原因是因爲COM依賴性和需要,以保證COM對象保持在相同的線程加載沒有COM編組。如前所述,它可以正常工作,直到所有實例都處於繁忙狀態,然後纔會停止,直到池釋放新實例。

我可以理解的是,COM對象可能會被阻止,但我真的不明白爲什麼主線程ASP.NET會失敗,即使加工原料處理請求(即我有一個運行一個普通的響應標誌.Write()響應和返回,它就像COM請求時池和飽和一樣等待和等待)

我懷疑它與COM對象實例化有關,但我很困惑爲什麼會出現這種情況對象是在非ASP託管線程上創建的。

有人看到的行爲像這樣的地方ASP.NET根本不會創造新的請求的線程,簡單地排隊?

回答

3

客戶端操作系統(例如Windows 7)上的IIS對併發連接數有限制。例如,見http://forums.iis.net/p/1229666/2114928.aspx?Is+there+an+Concurrent+Request+Limit+on+IIS+8+5+

+0

是的 - 只是去和傾倒的處理程序到直播服務器,並能證實它工作得很好那裏與COM的實例加載了與原處理程序後立即開火。唷 - 我以爲我瘋了。 –

+0

當然,希望他們至少在對本地主機IP進行測試時會刪除這些限制。這使得在本地機器上開發負載方案非常困難,除非您在服務器操作系統上進行開發:-( –