Я работаю над проблемой в своем приложении WPF, которое использует членство ASP.NET & Поставщики ролей для SQL Anywhere. Приложение использует объекты BackgroundWorker
для выполнения задач в фоновом режиме от потока пользовательского интерфейса. В двух словах:Когда создается пул потоков?
- При запуске программы, приложение позволяет пользователю войти в систему
- После того, как пользователь вошел в систему, он создает экземпляр пользовательского класса
User
.. Этот класс реализует интерфейсIPrincipal
. - После создания экземпляра настраиваемого класса
User
он передается методуAppDomain.SetThreadPrincipal
, так что каждый созданный новыйThread
использует его как значение по умолчаниюPrincipal
. - В фоновых задачах используется свойство
Thread.CurrentThread.Principal
, чтобы определить имя пользователя, который в настоящее время вошел в систему, и получить разрешения пользователя от поставщикаRole
.
Этот механизм отлично работает в течение 3 лет, но в последнее время что-то изменилось. Мы обновили ряд сторонних библиотек, и теперь потоки BackgroundWorker
используют по умолчанию Principal
, который имеет пустую строку в качестве имени пользователя. Это означает, что данные не извлекаются из базы данных при выполнении проверок ролей и фоновых задач не работают.
Похоже, что потоки в пуле потоков создаются раньше, чем раньше, до недавних обновлений. Я хотел бы узнать, когда они создаются, поэтому я могу исследовать возможность выполнения процесса входа пользователя в систему в начале процесса.
Только когда .NET создает пул потоков и потоки внутри него?
.Net-пул потоков является статическим доступом, загружает, как только CLR загружается в процессе (mscoree.dll), он всегда был таким, на самом деле это для всех экземпляров CLR. В этом случае проблема, которую вы можете отлаживать, - это то, что происходит, когда BackgroundWorker обращается к API-интерфейсам Membership для получения имени пользователя, скорее всего, проблема будет там. Возможно, вы захотите добавить некоторые протоколирования, чтобы выяснить, что происходит при доступе к API членства. –
Пул потоков создается при запуске программы. При запуске создаются несколько потоков потоков, но при необходимости создаются другие по требованию. См. Http://msdn.microsoft.com/en-us/library/system.threading.threadpool (v = vs.110) .aspx –