C# 锁定Thread.CurrentThread.CurrentUICulture
我有一个方法,它使用特定的CurrentUICulture运行一个操作,最后它回滚到原始的CurrentUICulture。下面是片段C# 锁定Thread.CurrentThread.CurrentUICulture,c#,asp.net,multithreading,thread-safety,currentuiculture,C#,Asp.net,Multithreading,Thread Safety,Currentuiculture,我有一个方法,它使用特定的CurrentUICulture运行一个操作,最后它回滚到原始的CurrentUICulture。下面是片段 private static void ExecuteInLanguage(string language, Action action) { var current = Thread.CurrentThread.CurrentUICulture; try { Thread.
private static void ExecuteInLanguage(string language, Action action)
{
var current = Thread.CurrentThread.CurrentUICulture;
try
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);
action();
}
finally
{
Thread.CurrentThread.CurrentUICulture = current;
}
}
CurrentUICulture在项目的不同部分中临时更改
问题是,有时“action()”不会与传递给“ExecuteInLanguage”的临时设置的CurrentUICulture一起运行,而是与其他语言一起运行,这可能是因为CurrentUICulture在其他地方同时发生了更改
使用“锁定”是避免上述问题的正确解决方案吗
private static void ExecuteInLanguage(string language, Action action)
{
var current = Thread.CurrentThread.CurrentUICulture;
try
{
lock (Thread.CurrentThread.CurrentUICulture)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);
action();
}
}
finally
{
Thread.CurrentThread.CurrentUICulture = current;
}
}
不,锁在这里没用。但是,如果
action
完全在同一个线程上运行(没有异步或类似的东西),那么唯一可以改变ui区域性的地方就是action
本身。谢谢@Evk。UI区域性不会更改为操作,但它是在项目的其他部分、其他方法中设置的。但是,如果操作是连续的且始终在同一线程中运行,则在使用相关代码执行时,任何内容都无法更改UI区域性(操作执行的线程的区域性)。您正在设置thread.CurrentThread.CurrentUICulture,因此,当前线程的文化。不同的线程区域性不会影响它。这似乎是使用全局设置尝试修复本地问题的问题。解决方法是将区域性显式传递给操作
。