2012-09-24 56 views
0

我需要構建一個使用第三方win32 dll作爲所有業務邏輯網關的web應用程序(MVC)(包含登錄機制,函數和維護一些州)。 這個DLL不是專爲多線程而設計的。在MTA場景中,dll在一段時間後發生st st。 推薦的解決方案是在ASP-Classic模式下運行ASP.NET MVC(使用Asp-CompatHandler的STA)。我試着成功 - 一切運行穩定。 問題是,會有很多併發用戶,一些函數調用需要幾秒鐘(最多10秒鐘!)。如果所有用戶互相阻止,這將會變得很糟糕。 在相同的應用程序中最小化阻塞效應的最佳方法是什麼?說只有十個用戶應該互相阻止?Asp.Net Mvc和Win32 dll不是爲多線程設計的

如果這將是很好: ......網絡在MTA 運行......網絡是剛剛部署一次 ......一切都在同一進程中運行

任何人都可以給我一些建議解決這個問題的好理念?

謝謝!馬丁

更新 - 找到了解決辦法: 感謝來自阿美欄中的「智能線程池」我可以完成我一直在尋找(容易)的行爲。我實現了一個工作者概念(特定的用戶共享一個工作者並在這個工作者中相互阻塞),並且對於每個工作者,我現在擁有自己的線程池實例,其最大和最小數量爲一個線程。那麼,這不是線程池的想法,但它使處理工作項非常容易,並且它還具有一些其他功能。 Web應用程序現在正在MTA上運行。 我要準備一些負載測試,看看它是否穩定超過幾個小時。 在這裏看到:http://www.codeproject.com/Articles/7933/Smart-Thread-Pool

回答

0

答案很簡單,但我不認爲你會喜歡多:你不能用的東西,是不是設計爲在多線程環境在多線程環境中使用。

兩個可能性:

  • 直播與STA
  • 的東西,是爲了在Web應用程序中使用
0

不幸的是,如果DLL不更換單線程COM對象旨在用於並行請求,您不能將其用於並行請求。

我看到您唯一的解決方案是在不同時運行應用程序的情況下增加併發用戶的數量,是讓應用程序的多個實例同時運行,可能在它們前面有一個負載平衡器來分派查詢。