Загрузка dll из gac блокирует приложение - PullRequest
1 голос
/ 25 февраля 2009

В последние несколько месяцев мое приложение становилось все больше и больше. На данный момент он работает как Wpf .EXE и XBAP, оба используют один и тот же код. В нескольких точках приложения приложение блокируется. После проверки я обнаружил, что в эти моменты приложение загружает dll из GAC.

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

Все началось в считанные секунды, но в данный момент в некоторых моментах вам придется подождать пару минут, прежде чем приложение продолжит работу. Я думаю, что это неприемлемо.

Есть ли способ перенести загрузку DLL из GAC в другой поток? Итак, можно ли воспроизвести анимацию «Пожалуйста, подождите, пока приложение загружено»? Или, что еще лучше, я могу перенести загрузку всех dll, необходимых для запуска приложения, чтобы при работе было меньше ожиданий.

1 Ответ

2 голосов
/ 25 февраля 2009

Да (по крайней мере, на «секунды»; не уверен, что он масштабируется до «минут») - на экране входа в систему просто раскрутите рабочий поток (возможно, с ThreadPool), который выполняет то, что требует этих сборок. Это заставит их загружаться ...

ThreadPool.QueueUserWorkItem(LoadAssemblies);
...
static void LoadAssemblies(object state)
{
    Widget1 widget = new Widget1(); // but just let it go (perhaps dispose it)
}

Вы отключились от потока пользовательского интерфейса, загружая сборки, пока пользователь вводит их пароль.

...