gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:12 25 4
gpt4 key购买 nike

当使用任务并行库或 .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");
}

关于c# - 如何在重用线程池线程之前执行清理代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45084020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com