Кажется, что неуправляемый код не является потокобезопасным. Вот хорошая дискуссия по вашей проблеме:
Ответы от http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/504cdc70-16f1-4c39-a0c0-1d47b2a64f7b/
Осторожнее всего то, что неуправляемый код не может быть поточно-ориентированным. В контексте веб-службы каждый запрос будет поступать в отдельном потоке, и неуправляемый код может не справиться с этим. Эти сбои могут быть признаками повреждения памяти, вызванного кодом, который не был протестирован в многопоточной среде.
Существует несколько различных проблем с неуправляемым кодом, которые вы можете вызывать из управляемого кода:
1.
Возможно, небезопасно вызывать неуправляемый код более чем в одном потоке одновременно. Эту проблему можно решить с помощью правильной блокировки. Я подчеркиваю правильно.
2.
Неуправляемый код может как-то зависеть от того, что все время вызывается в одном и том же потоке Это менее вероятно, но возможно. Это не может быть решено непосредственно в веб-приложении ASP.NET или приложении веб-службы, если вы каким-либо образом не запустите поток при запуске приложения и не перенаправите все запросы для этого кода в этот один поток.
3.
Неуправляемый код может быть кодом COM и зависеть от работы в конкретной квартире. Я не знаю, есть ли решение для этого.
Там не будет общего решения этой проблемы, по крайней мере, не то, что вы можете решить. Общее решение состоит в том, чтобы разработчик или поставщик неуправляемого кода сделал свой код безопасным для вызова из управляемого кода в нескольких потоках. Пока они полностью не протестировали свой код в этой среде, вы не можете быть уверены, что он будет работать.