什么时候创建线程池?

时间:2014-09-26 13:04:06

标签: c# asp.net wpf multithreading

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

  1. 在程序启动期间,应用程序允许用户登录。
  2. 用户登录后,会创建自定义User类的实例。该类实现IPrincipal接口。
  3. 创建自定义User类的实例后,会将其传递给AppDomain.SetThreadPrincipal方法,以便创建的每个新Thread都将其用作默认Principal }。
  4. 后台任务使用Thread.CurrentThread.Principal属性来确定当前登录用户的名称,并从Role提供程序中检索用户的权限。
  5. 这种机制已经运作了3年,但最近发生了一些变化。我们升级了许多第三方库,现在,BackgroundWorker线程使用默认的Principal,其中空字符串作为用户名。这意味着在执行角色检查且后台任务不起作用时,不会从数据库中检索数据。

    因此,似乎线程池中的线程比最近升级之前的线程更早创建。我想知道它们何时被创建,以便我可以调查在启动早期执行用户登录过程的可能性。

    .NET何时创建线程池及其内部的线程?

1 个答案:

答案 0 :(得分:0)

虽然我无法确切确认何时启动线程池,但我可以确认它是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上的The Managed Thread Pool页:

  

从.NET Framework 4开始,使用线程池的最简单方法是使用任务并行库(TPL)。默认情况下,任务和任务等并行库类型使用线程池线程来运行任务。