线程池何时创建

本文关键字:创建 何时 线程 | 更新日期: 2023-09-27 18:24:34

我正在处理我的WPF应用程序中的一个问题,该应用程序使用SQL Anywhere的 ASP.NET 成员资格和角色提供程序。 应用使用 BackgroundWorker 对象在后台执行 UI 线程的任务。 简而言之:

  1. 在程序启动期间,应用程序允许用户登录。
  2. 用户登录后,它将创建自定义User类的实例。 此类实现IPrincipal接口。
  3. 创建自定义User类的实例后,将其传递给 AppDomain.SetThreadPrincipal 方法,以便创建的每个新Thread都将其用作默认Principal
  4. 后台任务使用 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(使用线程池线程来运行任务。