线程,CultureInfo .net,TPL,PLINQ
发布时间:2020-05-25 05:50:17 所属栏目:Python 来源:互联网
导读:无法将整个.net应用程序设置为除.net中的用户配置文件之外的其他文化.控制cultureinfo的适当方法似乎是在DateTime等对象上使用专用方法. 但是,在处理大量遗留代码时(并非所有代码都在您的控制之下),这是不可能实现的.因此,可以例如创建Thread och Threadpool
|
无法将整个.net应用程序设置为除.net中的用户配置文件之外的其他文化.控制cultureinfo的适当方法似乎是在DateTime等对象上使用专用方法. 但是,在处理大量遗留代码时(并非所有代码都在您的控制之下),这是不可能实现的.因此,可以例如创建Thread och Threadpool的子类/包装器,并在执行委托之前设置所需的cultureinfo,或者可以要求委托本身包含一组文化. (难以验证并容易出现错误……) 看看TPL,更具体地说是PLINQ,但是我发现很难(如果不是不可能的话)以集中的方式改变文化环境. 在遗留代码中处理overriding thread / application-cultureinfo的任何建议? 谢谢! 解决方法启动线程时,最初使用 Windows API中的GetUserDefaultLCID确定其文化.我发现没有办法(我认为没有办法)来覆盖这种行为.你唯一能做的就是之后设置线程文化.我写了一个扩展名.为了那个原因: public static class ParallelQueryCultureExtensions
{
public static ParallelQuery<TSource> SetCulture<TSource>(this ParallelQuery<TSource> source,CultureInfo cultureInfo)
{
SetCulture(cultureInfo);
return source
.Select(
item =>
{
SetCulture(cultureInfo);
return item;
});
}
private static void SetCulture(CultureInfo cultureInfo) {
if (Thread.CurrentThread.CurrentCulture != cultureInfo) {
Thread.CurrentThread.CurrentCulture = cultureInfo;
}
}
}
因此,如果您在使用.AsParallel()分割原始源之后使用它,您将得到您想要的. CultureInfo kaCulture = CultureInfo.GetCultureInfo("ka-Ge");
int[] array = new int[100];
Random random = new Random();
int index =0;
Array.ForEach(array,i => { array[index++] = index;});
array
.AsParallel()
.SetCulture(kaCulture)
.ForAll(
i =>
{
Thread.Sleep(random.Next(5));
Console.WriteLine("Thread-{0} t Culture-'{1}' t Element-{2}",Thread.CurrentThread.ManagedThreadId,Thread.CurrentThread.CurrentCulture,i);
});
Console.WriteLine("Press any key to quit");
Console.ReadKey(); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
