繁体   English   中英

什么时候创建线程池?

[英]When is the Thread Pool created?

我正在处理WPF应用程序中的问题,该应用程序将ASP.NET成员资格和角色提供程序用于SQL Anywhere。 该应用程序使用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库在SomeMethod使用了它。 从MSDN上的“托管线程池”页面:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM