我在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);
任何帮助将不胜感激!
答案 0 :(得分:1)
似乎无人管的代码不是线程安全的。以下是您正在讨论的问题的一个很好的讨论:
需要注意的是,非托管代码可能不是线程安全的。在Web服务的上下文中,每个请求将到达不同的线程,而非托管代码可能无法处理。这些崩溃可能是由未在多线程环境中测试的代码导致内存损坏的迹象。
您可能希望从托管代码调用非托管代码存在几个不同的线程问题:
1。 在多个线程上同时调用非托管代码可能不安全。正确锁定可以解决此问题。我强调正确。 2。 非托管代码可能以某种方式依赖于始终在同一个线程上调用。这不太可能,但可能。这不能直接在ASP.NET Web应用程序或Web服务应用程序中解决,除非您在应用程序启动时以某种方式启动一个线程,并将对此代码的所有请求编组到该一个线程。 3。 非托管代码可以是COM代码,并且依赖于在特定公寓中运行。我不知道是否有解决方案。
这个问题没有一般解决方案,至少不能解决。一般的解决方案是让非托管代码的开发人员或供应商使他们的代码安全,从多个线程上的托管代码调用。在他们在该环境中彻底测试他们的代码之前,你无法确定它是否会起作用。