Медленный P / Invoke через несколько раз - PullRequest
1 голос
/ 20 октября 2011

Я использую библиотеку C #, которая действует как оболочка для неуправляемой библиотеки.Эта библиотека опирается на P / Invoke.

Я испытываю что-то странное: в моем приложении WinForms у меня есть кнопка, которая, нажимая, выполняет итерацию от 1 до N и на каждой итерации выполняетвызов этой библиотеки.

Каждый раз, когда я нажимаю кнопку (не закрывая приложение), время для вызова метода из функции постоянно для первой итерации (около половины секунды), но для остальных, она сильно варьируется, варьируется от этой полсекунды до примерно 2 минут.

Работа в каждой итерации несколько одинакова, поэтому она не понятна.

Я заметил, что этоЗамедление происходит, когда библиотека вызывает неуправляемую функцию.

Есть идеи о том, что это может быть и как я могу улучшить это?

Заранее спасибо!

-edit- Примечаниечто каждый раз, когда я нажимаю кнопку снова, первая итерация цикла выполняется быстро, но объект, который я вызываю, уже инициализирован (это глобальная статическая переменная)!

-edit2-До сих пор мне удалось решить эту проблему, выполнив все вызовы неуправляемой функции из выделенного потока.Тем не менее, я до сих пор не понял, почему основной поток GUI не смог обработать его (не было других потоков, выполняющих вызовы).

1 Ответ

1 голос
/ 20 октября 2011

P / Invoke должен быть просто нормальной операцией вызова библиотеки. Вы подразумеваете, что проблема заключается в переходе от управляемого к неуправляемому. Тем не менее, я никогда не находил это проблемой.

Это скорее библиотека нативного кода, которая останавливается. Возможно, ожидание освобождения ресурса, такого как мьютекс или блокировка файла, который истекает при последующих вызовах? Убедитесь, что ваш прототип функции правильный, и что вы не получаете исключений из-за дисбаланса стека или эквивалентного.

...