我正在处理WPF应用程序中的一个问题,该应用程序使用ASP.NET Membership& SQL Anywhere的角色提供程序。该应用程序使用BackgroundWorker
个对象在UI线程的后台执行任务。简而言之:
User
类的实例。该类实现IPrincipal
接口。User
类的实例后,会将其传递给AppDomain.SetThreadPrincipal
方法,以便创建的每个新Thread
都将其用作默认Principal
}。Thread.CurrentThread.Principal
属性来确定当前登录用户的名称,并从Role
提供程序中检索用户的权限。这种机制已经运作了3年,但最近发生了一些变化。我们升级了许多第三方库,现在,BackgroundWorker
线程使用默认的Principal
,其中空字符串作为用户名。这意味着在执行角色检查且后台任务不起作用时,不会从数据库中检索数据。
因此,似乎线程池中的线程比最近升级之前的线程更早创建。我想知道它们何时被创建,以便我可以调查在启动早期执行用户登录过程的可能性。
.NET何时创建线程池及其内部的线程?
答案 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)。默认情况下,任务和任务等并行库类型使用线程池线程来运行任务。