草庐IT

C# BackgroundWorker的文化

coder 2023-07-12 原文

我想为我的整个应用程序设置文化。我尝试了以下操作:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(wantedCulture);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(wantedCulture);
Application.CurrentCulture = CultureInfo.CreateSpecificCulture(wantedCulture);

它适用于当前线程,但稍后我创建并启动了一个后台工作线程。当我创建工作人员时,当前线程使用 wantedCulture 执行,但工作线程将使用我计算机的文化运行。

有什么想法可以为整个应用程序设置文化吗?

最佳答案

注意:过时的 Material ,请务必阅读底部的更新以了解 .NET 4.6 中的更改

是的,这是一个常见的请求,但它不可用。 Windows 始终将操作系统线程初始化为系统默认 LCID,在控制面板的区域和语言选项小程序中配置。只要您自己创建线程,就可以覆盖它。但这对于线程池线程和可能由运行进程的某种非托管代码(如 COM 服务器)创建的线程来说并不实用。

后一种情况就是问题所在。 .NET 在非托管代码创建的线程上运行托管代码没有问题。但是它不能对线程的初始化方式做任何事情。这对于 CurrentUICulture 是正确的,但对于像 Thread.SetApartmentState() 这样的更晦涩的东西也是如此。不要低估这样的线程在您的程序中运行代码的可能性,Microsoft 编写的 COM 服务器非常适合线程。

您将不得不仔细梳理您的代码,并找出任何可能在您未创建的线程上运行的代码。任何事件处理程序都是可疑的,任何具有回调的 BeginXxx() 方法也是如此。 BackgroundWorker 绝对是较小的问题。

不覆盖线程的文化会产生非常微妙且难以诊断的错误。一个很好的例子是一个以字符串为键的 SortedList。当以错误的文化运行时,它会随机地找不到列表中实际存在的元素。由于在具有不同排序规则的另一种文化中不再对列表进行排序。

如果我成功地吓到你了,那么我就传达了我的信息。这发生在我身上,调试一个非常大的程序在丹麦机器上运行不正常的问题。我们没有丹麦语本地化版本,因此强制 UI 以英语运行。工作线程使用以字符串为键的红黑树。当要求处理 Åårdvårks 时,它随机失败。花了我一个星期。


更新:此问题已在 .NET 4.5 中得到解决。 CultureInfo 类现在有一个 DefaultThreadCurrentCulture和 DefaultThreadCurrentUICulture。设置后,它将用于初始化任何托管线程的文化,而不是默认的 Windows 系统文化。我还不清楚它究竟如何与由 native 代码启动并进入托管代码的线程交互。


更新:此问题在 .NET 4.6 中有更彻底的解决方案。文化现在自动流动,这是理想的行为。 CultureInfo.CurrentCulture() 的 MSDN 文章谈论它。提供的信息仍然令人困惑,实验上它似乎也流向 Thread 对象,而不仅仅是 Task 或线程池线程,并且未使用 DefaultThreadCurrentCulture。进两步,退一步,建议测试。

关于C# BackgroundWorker的文化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2385942/

有关C# BackgroundWorker的文化的更多相关文章

  1. 焕新古文化传承之路,AI为古彝文识别赋能 - 2

    目录1古彝文与古典保护2古文识别的挑战2.1西文与汉文OCR2.2古彝文识别难点3合合信息:古彝文保护新思路3.1图像矫正3.2图像增强3.3语义理解3.4工程技巧4总结1古彝文与古典保护彝文指的是云南、贵州、四川等地的彝族人使用的文字,区别于现代意义上的彝文,古彝文指的是在民间流通使用的原生态彝文,多达87046字。古彝文的起源距今至少数千年,是世界上最古老的文字之一。对古彝文字集研究有助于理解尚未被翻译成汉文、用字尚未规范化的古籍,更深层、透彻地作用于传统文化保护。古彝文字义对照图(网络资料+邵文苑供图)古籍是不可再生的宝贵资源,应当得到妥善保护。中国的古籍在历史上迭经水火兵燹等自然灾害、

  2. c# - 你能像在 .NET 中一样在 javascript 中获取文化信息字符串吗? - 2

    这个问题在这里已经有了答案:CultureInfoinJavaScript(3个答案)关闭9年前。我需要从浏览器的语言中获取文化字符串。我考虑过像这样从javascript获取它:varuserLang=navigator.language||navigator.userLanguage;但它只提供了我将从.NET获得的文化信息的第一部分:Thread.CurrentThread.CurrentCulture.Name;所以javascript给了我“de”或“pl”,而不是.NET中的“de-DE”或“pl-PL”。有没有办法获得“完整信息”?

  3. JavaScript 文化敏感货币格式 - 2

    如何在JavaScript中以文化感知的方式格式化与货币相关的数据? 最佳答案 所以我知道这是一个老问题,但万一有人出现在寻找类似的答案,在现代JavaScript中你可以使用newIntl.NumberFormat('de-DE',{style:'currency',currency:'EUR'}).format(number)有关更多信息,请参阅引用文档。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Nu

  4. c# - 未找到 BackgroundWorker - 2

    我在WindowsPhone8.1中使用System.componentmodel引用来获取BackgroundWorker但每次我放置BackgroundWorker时它都会给我错误CS0246找不到类型或命名空间名称“BackgroundWorker”(是否缺少using指令或程序集引用?)HealthBandC:\Users\husam\Desktop\Projects\HealthBand\HealthBand\ConnectionManager.cs16我尝试添加引用,但它说它已经添加当我把usingSystem.ComponentModel;它说using指令是不必要的这是

  5. 国内首家专注影视文化产业的数藏平台“神缘”即将上线 - 2

     相比于海外NFT在各路资本、明星、开发者的追捧,层出不穷的项目创意玩法,人们的注意力似乎都从一个NFT的艺术本质,全部转移到了“地板价”及市值等,在风口下人们都想更“艺术”的玩转“区块链”。一方面可以”一不小心“赚得名声利益“,另一方面也向其所在的社交圈骄傲的表达自己的”艺术涵养“。而数字藏品,这个更具“中国特色”的新形态,其概念也是在2021年10月,国家监管下正式提出,国内NFT发行平台的NFT字样全部改为“数字藏品”,不同于实物文创产品,以区块链技术为基地,区分为区块链作品版权和区块链数字出版产品两种类型。对应特定的作品、艺术品生成的唯一数字凭证,在保护其数字版权的基础上,实现数字发行

  6. c# - BackGroundworker 取消不适用于 wbadmin.exe - 2

    好的,我正在使用:带有Windows窗体的C#我有一个后台工作,它可以工作。现在我想创建一个取消按钮,但即使我告诉它取消并且后台接受了它,它仍会继续运行它触发的可执行文件。我有一个带有以下代码的取消按钮privatevoidcancelBackup_Click(objectsender,EventArgse){backgroundWorker1.CancelAsync();displayResults.Text="OperationCancelled";}后台工作代码在这里:privatevoidbackgroundWorker1_DoWork(objectsender,DoWorkE

  7. c# - Windows 不变文化之谜 - 2

    我有一个关于Windows不变文化的问题。简而言之,我的问题是:是否存在任何一对字符c1和c2使得:lower(c1,invariant)=latin-generallower(c2,Invariant)但是降低(c1,不变)!=不变降低(c2,不变)背景:我需要在SQLServerCompact中存储一个不变的小写字符串(表示文件名),它不支持Windows不变排序规则。理想情况下,我希望不必将我所有的比较逻辑从数据库中提取到我的应用程序中。解决这个问题的想法是存储所有文件名的两个版本:一个用于向客户显示数据,另一个用于执行比较。在将比较列存储到数据库之前,将使用windows不变语

  8. windows - 在没有 "Cross Threading"的情况下,我可以从 BackgroundWorker 访问什么? - 2

    我意识到我无法从BackgroundWorker的DoWork事件处理程序访问表单控件。(如果我尝试这样做,我会得到一个异常,正如预期的那样)。但是,我可以访问存在于我的表单上的其他(自定义)对象吗?例如,我创建了一个“设置”类并在我的表单中实例化了它,我似乎能够读取和写入它的属性。这只是运气好吗?如果我有一个静态类怎么办?我可以安全地访问它吗? 最佳答案 @英格拉姆:您已经了解了它的要点-CrossThreadCalls只是MS放入.NETFramework中的一个很好的功能,用于防止“笨蛋”类型的并行编程错误。它可以被覆盖,正如

  9. windows - 什么是最普遍/最常见的南美西类牙文化 - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭9年前。Improvethisquestion我们的应用程序具有拉丁美洲西类牙语的语言概念,我需要选择一个文化信息以用于该语言文件。微软拥有17个不同拉丁美洲国家的文化,我需要选择一个最能代表它们的文化。关于可能是哪一个的任何输入?

  10. .net - BackgroundWorker:一旦 DoWork() 事件处理程序完成,它就死了吗? - 2

    我要说的是,一旦您使用DoWork()处理程序完成工作,然后可能执行RunWorkerCompleted(),您能否重新调用RunWorkerAsync()并让它重新进入DoWork()处理程序,还是您需要再做一次"new"操作并创建一个新的BackgroundWorker?只是想知道在这些事情发生之后是否进行了任何处理或其他清理,现在您不再有可行的bgworker。 最佳答案 您可以随心所欲地调用RunWorkerAsync。您不需要创建新的BackgroundWorker对象。唯一的限制是您不能在BackgroundWorker

随机推荐