2011-09-26 95 views
1

我有一個非託管dll在IIS 7上運行的asp.net上運行。大多數時間在幾個請求後,應用程序掛起大約一分鐘,然後繼續或顯示錯誤。 我是否必須處置,釋放或調用DLL不同?非託管dll,掛起/等待/慢

[DllImport("Fan.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
public static extern int GET_CALCULATION_FAN_ALONE_PC(ref string input, string buffer); 

任何幫助將不勝感激!

+1

'GET_CALCULATION_FAN_ALONE_PC'線程安全的實現嗎? – vcsjones

+0

靜態時DLL導入是線程安全的http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute%28v=vs.71%29.aspx –

回答

1

看來,unmanged代碼不是線程安全的。這裏是您所遇到的問題好好討論:

答案從http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/504cdc70-16f1-4c39-a0c0-1d47b2a64f7b/

事情要小心的是,非託管代碼可能不是線程安全的。在Web服務的上下文中,每個請求都將到達不同的線程,而非託管代碼可能無法處理該請求。這些崩潰可能是由未在多線程環境中測試過的代碼導致的內存損壞的跡象。

有幾個與非託管代碼不同的線程的問題,你可能想從託管代碼調用:

1. 它可能不是安全地調用上的多個線程中的非託管代碼在同時間。這個問題可以通過正確的鎖定來解決。我強調正確。 2. 非託管代碼可能在某種程度上依賴於始終在同一個單獨的線程上調用。這是不太可能的,但可能的。這不能直接在ASP.NET Web應用程序或Web服務應用程序中解決,除非您在應用程序啓動時以某種方式啓動線程,並將此代碼的所有請求編組爲該線程。 3. 非託管代碼可能是COM代碼,並取決於在特定公寓中運行。我不知道是否有解決方案。

這個問題不會有一個通用的解決方案,至少不是你可以解決的。一般的解決方案是讓非託管代碼的開發者或供應商使他們的代碼安全地從多線程上的託管代碼中調用。直到他們在該環境中徹底測試了他們的代碼之後,才能真正確定它會起作用。