当使用任务并行库或 .net 中的其他函数在线程池中的线程中执行代码时,线程将被重复用于彼此不相关的不同任务。
我有一个问题,在线程池中的线程中执行的某些代码可能会改变线程的环境(如线程本地文化、模拟或类似事物),这会影响在同一线程上运行的其他代码稍后。
有没有办法在返回线程池或从线程池中取出之前注册一个函数在线程池中的线程中运行。
此函数然后可以进行一些清理,将线程环境重置为默认设置。
澄清一下:这是一个庞大的项目,其中包含许多现有代码,并且有多个程序员在从事该项目。此外,不同的方法用于访问 threadool 线程,不仅是 TPL,还包括直接访问 ThreadPool.QueueUserWorkItem
。
我正在寻找一种在中心位置解决此问题的方法,而无需调整在池化线程中运行的所有单个代码实例。
例如,调用StartNew
工厂方法时,可以在同一个任务上调度多个方法。您在执行工作后设置清理逻辑,以便在 StartNew
完成后,线程返回到其原始状态。我认为其他 TPL 方法会类似。
static void Main(string[] args)
{
Task.Factory.StartNew(() =>
{
First();
Second();
Third();
}).Wait();
Console.ReadLine();
}
static void First()
{
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
}
static void Second()
{
//Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("pl-PL");
}
static void Third()
{
Console.WriteLine(Thread.CurrentThread.CurrentCulture.Name);
}
此代码将打印“en-Us”,但如果您取消注释 Second()
中的行,它将打印“pl-PL”。
有一定的潜力可以制作专门的方法,例如:
static Task StartNewAndCleanup(Action action)
{
return Task.Factory.StartNew(() =>
{
action();
Cleanup();
});
}
static void Cleanup()
{
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("pl-PL");
}
我是一名优秀的程序员,十分优秀!