【发布时间】:2014-09-26 13:04:05
【问题描述】:
我正在处理我的 WPF 应用程序中的一个问题,该应用程序使用 SQL Anywhere 的 ASP.NET 成员资格和角色提供程序。该应用程序使用 BackgroundWorker 对象在 UI 线程的后台执行任务。简而言之:
- 在程序启动期间,应用程序允许用户登录。
- 一旦用户登录,它就会创建一个自定义
User类的实例。此类实现IPrincipal接口。 - 创建自定义
User类的实例后,会将其传递给AppDomain.SetThreadPrincipal方法,以便创建的每个新Thread都将其用作默认Principal。 - 后台任务使用
Thread.CurrentThread.Principal属性来确定当前登录用户的名称,并从Role提供程序检索用户的权限。
这种机制已经运行了 3 年,但最近发生了一些变化。我们已经升级了许多第三方库,现在BackgroundWorker 线程使用默认的Principal,它的用户名是空字符串。这意味着当执行角色检查并且后台任务不工作时,不会从数据库中检索任何数据。
因此,线程池中的线程似乎比最近升级之前的创建时间更快。我想知道它们是什么时候创建的,这样我就可以调查在启动的早期执行用户登录过程的可能性。
.NET 何时创建线程池和其中的线程?
【问题讨论】:
-
.Net 线程池是静态访问,CLR 在进程中加载时立即加载(mscoree.dll),一直都是这样,实际上这适用于机器范围内的所有 CLR 实例。在这种情况下,您可能想要调试的问题是 BackgroundWorker 访问 Membership API 以获取用户名时发生的情况,最有可能的问题就在那里。您可能需要添加一些日志记录,以了解访问会员 API 时会发生什么。
-
线程池是在程序启动时创建的。一些池线程在启动时创建,但其他线程根据需要按需创建。见msdn.microsoft.com/en-us/library/…
标签: c# asp.net wpf multithreading