2011-09-26 56 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代码,并取决于在特定公寓中运行。我不知道是否有解决方案。

这个问题不会有一个通用的解决方案,至少不是你可以解决的。一般的解决方案是让非托管代码的开发者或供应商使他们的代码安全地从多线程上的托管代码中调用。直到他们在该环境中彻底测试了他们的代码之后,才能真正确定它会起作用。