[英]When is the Thread Pool created?
我正在处理WPF应用程序中的问题,该应用程序将ASP.NET成员资格和角色提供程序用于SQL Anywhere。 该应用程序使用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
库在SomeMethod
使用了它。 从MSDN上的“托管线程池”页面:
从.NET Framework 4开始,使用线程池的最简单方法是使用任务并行库(TPL)。 默认情况下,并行库类型(例如Task和Task)使用线程池线程来运行任务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.