Загрузка dll из gac блокирует приложение

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

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

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

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


person Sorskoot    schedule 25.02.2009    source источник


Ответы (1)


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

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

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

person Marc Gravell    schedule 25.02.2009
comment
Я думал, что уже пробовал подобную конструкцию, но на этот раз это сработало. Спасибо! - person Sorskoot; 25.02.2009