P / Invoke [DllImport] в ASP.NET - PullRequest
0 голосов
/ 17 марта 2009

У меня есть некоторые проблемы с параллелизмом при использовании DLLImport, у меня есть Dll, который предоставляет некоторый отчет, который мне нужно отправить через Интернет, поэтому у меня есть это:

[DllImport("Rep.dll", EntryPoint = "PrintRep", CallingConvention = CallingConvention.StdCall, 
CharSet = CharSet.Ansi)]
private static extern string PrintRep(several params...);

А на стороне Dll есть множество переменных и экземпляров, которые затем возвращают путь с отчетом.

У моего кода теперь есть блокировка вызова PrintRep, которая работает, но, очевидно, заставляет ждать отложенные запросы, есть ли способ, чтобы это работало без блокировки? Потому что, если я снимаю блокировку, я получаю несколько ошибок «Попытка записи в защищенную память», и Dll в конечном итоге зависает.

Ответы [ 2 ]

1 голос
/ 17 марта 2009

Безопасен ли поток отчетов DLL? Я собираюсь угадать, нет, так как вы сказали, что если вы удалите блокировку, то вы получите ошибки. Итак, у вас есть два варианта: сделать DLL-библиотеку поточно-безопасной (требует исходного кода и изменений для старой dll) или сериализовать запросы к DLL, которые вы сделали. Это ваш единственный выбор. Однако нужно ли заставлять пользователей ждать отчета прямо сейчас? Можете ли вы, возможно, вести список пользователей, ожидающих отчет, и параметры, необходимые для вызова, а затем возвращать веб-страницу пользователю, чтобы он знал, что вы отправите ему отчет по электронной почте. Затем вы можете обрабатывать отчеты последовательно, не заставляя пользователей ждать результата.

0 голосов
/ 17 марта 2009

Если все веб-запросы ожидают, основываясь на этом вызове, вам следует рассмотреть возможность вызова этого в отдельном потоке, удержания блокировки и отправки только запросчику вызова PrintRep, ожидающему возврата вызова, для ожидания.

Если только люди, ожидающие завершения вызова PrintRep, ожидают, вы мало что можете сделать, кроме реализации какой-либо серверной рабочей очереди и получения доступа пользователей для проверки очереди, возможно с помощью обратного вызова AJAX.

Что бы вы ни делали, избегайте вызова этого в любом потоке ThreadPool. ASP.Net использует их для обработки запросов страниц.

...