线程池何时创建
本文关键字:创建 何时 线程 | 更新日期: 2023-09-27 18:24:34
我正在处理我的WPF应用程序中的一个问题,该应用程序使用SQL Anywhere的 ASP.NET 成员资格和角色提供程序。 应用使用 BackgroundWorker
对象在后台执行 UI 线程的任务。 简而言之:
- 在程序启动期间,应用程序允许用户登录。
- 用户登录后,它将创建自定义
User
类的实例。 此类实现IPrincipal
接口。 - 创建自定义
User
类的实例后,将其传递给AppDomain.SetThreadPrincipal
方法,以便创建的每个新Thread
都将其用作默认Principal
。 - 后台任务使用
Thread.CurrentThread.Principal
属性来确定当前登录的用户的名称,并从Role
提供程序检索用户的权限。
这种机制已经运行了 3 年,但最近发生了一些变化。 我们已经升级了许多第三方库,现在,BackgroundWorker
线程正在使用默认Principal
,它将空字符串作为用户名。 这意味着,在执行角色检查且后台任务不起作用时,不会从数据库中检索任何数据。
因此,线程池中的线程似乎比最近升级之前更早创建。 我想了解它们何时创建,以便我可以调查在启动早期执行用户登录过程的可能性。
.NET 何时创建线程池及其中的线程?
虽然我无法确切确认线程池的启动时间,但我可以确认它是否可从 Application.Startup
事件中获得,这是 WPF 应用程序中引发的第一个事件。这很容易测试。在 App.xaml
中添加此事件的处理程序,并从中运行Task
:
<Application x:Class="Midas.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="App_Startup">
...
</Application>
。
public void App_Startup(object sender, StartupEventArgs e)
{
Task startupTask = new Task(() => SomeMethod());
}
如果对SomeMethod
的调用有效,则线程池正在工作,因为Task
库在幕后使用它。从 MSDN 上的"托管线程池"页:
从 .NET Framework 4 开始,使用线程池的最简单方法是使用任务并行库 (TPL(。默认情况下,并行库类型(如 Task 和 Task(使用线程池线程来运行任务。