如何在重用之前在线程池线程上执行清理代码

时间:2017-07-13 14:43:46

标签: c# task-parallel-library threadpool

当使用任务并行库或.net中的其他函数执行线程池中的线程中的代码时,线程将被重用于彼此无关的不同任务。

我遇到一个问题,即在线程池的线程中执行的某些代码可能会改变线程的环境(如线程本地文化,模拟或类似的东西),这可能影响在同一线程上运行的其他代码以后。

有没有办法在线程池返回池之前或从池中取出之前注册要在线程池中运行的函数。

然后,此函数可以进行一些清理,将线程环境重置为默认设置。

澄清:这是一个庞大的项目,包含许多现有代码和一些程序员正在处理该项目。此外,不同的方法用于访问threadool线程,不仅是TPL,还直接访问ThreadPool.QueueUserWorkItem

我正在寻找一种在中心位置解决此问题的方法,而无需调整在池化线程中运行的所有单个代码实例。

1 个答案:

答案 0 :(得分:0)

例如,在调用strtok_r()工厂方法时,您可以在同一任务上安排多个方法。您在执行工作后设置清理逻辑,以便在StartNew完成后,线程返回其原始状态。我认为它与其他TPL方法类似。

StartNew

此代码将打印“en-Us”,但如果您取消注释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); } 中的行,则会打印“pl-PL”。

制作专门的方法有一些潜力,例如:

Second()