неуправляемый dll, зависает / ждет / медленно - PullRequest
1 голос
/ 27 сентября 2011

У меня есть неуправляемая dll, работающая в asp.net, работающая на IIS 7. В большинстве случаев после нескольких запросов приложение зависает примерно на минуту, прежде чем продолжить или выдает ошибку. Нужно ли распоряжаться, освобождать или вызывать DLLdifferent?

[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 Ответ

1 голос
/ 27 сентября 2011

Кажется, что неуправляемый код не является потокобезопасным. Вот хорошая дискуссия по вашей проблеме:

Ответы от http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/504cdc70-16f1-4c39-a0c0-1d47b2a64f7b/

Осторожнее всего то, что неуправляемый код не может быть поточно-ориентированным. В контексте веб-службы каждый запрос будет поступать в отдельном потоке, и неуправляемый код может не справиться с этим. Эти сбои могут быть признаками повреждения памяти, вызванного кодом, который не был протестирован в многопоточной среде.

Существует несколько различных проблем с неуправляемым кодом, которые вы можете вызывать из управляемого кода:

1. Возможно, небезопасно вызывать неуправляемый код более чем в одном потоке одновременно. Эту проблему можно решить с помощью правильной блокировки. Я подчеркиваю правильно. 2. Неуправляемый код может как-то зависеть от того, что все время вызывается в одном и том же потоке Это менее вероятно, но возможно. Это не может быть решено непосредственно в веб-приложении ASP.NET или приложении веб-службы, если вы каким-либо образом не запустите поток при запуске приложения и не перенаправите все запросы для этого кода в этот один поток. 3. Неуправляемый код может быть кодом COM и зависеть от работы в конкретной квартире. Я не знаю, есть ли решение для этого.

Там не будет общего решения этой проблемы, по крайней мере, не то, что вы можете решить. Общее решение состоит в том, чтобы разработчик или поставщик неуправляемого кода сделал свой код безопасным для вызова из управляемого кода в нескольких потоках. Пока они полностью не протестировали свой код в этой среде, вы не можете быть уверены, что он будет работать.

...