Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Не переключается текущая культура


Автор: 6atoh 4.5.2007, 19:46
Пытаюсь переключить текущую культуру вот таким способом:
Код

        CultureInfo ci = new CultureInfo("ru-RU");
        Thread.CurrentThread.CurrentCulture = ci;
        Thread.CurrentThread.CurrentUICulture = ci;

В отладчике показывает что культура поменялась, но на самом деле при выходе из функции культура опять сбрасывается на первоначальную. Я думаю это из-за того что у текущей культуры св-во IsReadOnly установлено в true.  smile . Как с этим бороться?

Автор: tol05 5.5.2007, 09:00
Нет, все нормально, если ты установил культуру в текущем потоке, значит она будет действительна для всех ф-ций данного потока. Значит при
Цитата(6atoh @  4.5.2007,  19:46 Найти цитируемый пост)
 при выходе из функции культура опять сбрасывается на первоначальную

ты переходишь в другой поток.
Проверь внимательно, поставь в функциях 
Код

Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

и посмотри, в одном ли потоке они выполняются?
 вот код для примера
Код

    class Program
    {
        delegate void Delegate();

        static void Do()
        {
            Console.Write("DO ");
            Console.WriteLine(Thread.CurrentThread.CurrentCulture);
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
        }

        static void Main(string[] args)
        {
            Console.Write("Main ");
            Console.WriteLine(Thread.CurrentThread.CurrentCulture);
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

            CultureInfo ci = new CultureInfo("en-US");
            Thread.CurrentThread.CurrentCulture = ci;
            Console.Write("Main ");
            Console.WriteLine(Thread.CurrentThread.CurrentCulture);
            F1();
            F2();
            Console.Write("Main ");
            Console.WriteLine(Thread.CurrentThread.CurrentCulture);
            Console.ReadLine();

            Delegate del = new Delegate(Do);
            del.BeginInvoke(CallBack, del);
            Console.Write("Main ");
            Console.WriteLine(Thread.CurrentThread.CurrentCulture);
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
            Console.ReadLine();
        }

        static void CallBack(IAsyncResult ar)
        {
            Console.Write("CallBack ");
            Delegate del = ar.AsyncState as Delegate;
            del.EndInvoke(ar);
            Console.WriteLine(Thread.CurrentThread.CurrentCulture);
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
            Console.ReadLine();
        }

        static void F1()
        {
            Console.Write("F1 ");
            Console.WriteLine(Thread.CurrentThread.CurrentCulture);
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
        }

        static void F2()
        {
            Console.Write("F2 ");
            Console.WriteLine(Thread.CurrentThread.CurrentCulture);
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
        }
    }


Как ты видишь, Main, F1 и F2 выполняются в одном потоке, а Do и CallBack - в другом

Автор: 6atoh 5.5.2007, 12:30
Проблема решена
Код

CultureInfo ci = new CultureInfo("ru-RU");
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

this.Server.Transfer(this.Request.Path);

Автор: 6atoh 5.5.2007, 16:48
tol05, ты прав, но неужели ASP.NET обрабатывает запросы от одного пользователя каждый раз в новом потоке.

Автор: tol05 5.5.2007, 17:17
Конечно. Пул потоков ASP.NET используется при обработке каждого нового запроса. Берется новый поток (из пула потоков CLR процесса - aspnet_wp.exe для IIS5.х) для его обработки и уже в нем создаются объекты конвейера HTTP (HttpApplication, Page, да и все остальные) smile 
Поэтому кстати еще и существуют пул приложений (HttpApplication объектов). 
Да и асинхронные обработчики используют потоки из пула. 

Все это можно почитать у Оньена ("Основы ASP.NET с примерами на C# Фриц Оньон") или см его статью 
http://www.microsoft.com/rus/msdn/magazine/archive/2003-06/threads_and_anisochronous_handlers.asp

Автор: 6atoh 5.5.2007, 17:24
tol05, спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)