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


Автор: Гость_iskan 12.5.2005, 11:10
Кто нибудь подскажите пожадуйста как определить локальную для потока переменную
в .NET?

Автор: stab 12.5.2005, 11:31
Любая переменная объявленная в методе потока является локальной для потока.
Добавлено @ 11:35
Как вариант, можно работать с Thread.AllocateDataSlot, Thread.SetData, Thread.GetData, но, IMHO, кроме дополнительных заморочек ни чего нового в код это не принесет.

Автор: arilou 12.5.2005, 12:44
Цитата(cully @ 12.5.2005, 11:31)
кроме дополнительных заморочек ни чего нового в код это не принесет.

Еще как принесет - а если у тебя один поток (или несколько) обслуживают разных клиентов, тебе нужно сохранять-загружать локальную информацию.

Автор: Гость_iskan 12.5.2005, 13:08
Уточню,
у меня есть сессия NHibernate я хочу чтобы она открывалась как только понадобиться и закрывалась после обработки запроса.

я хотел бы написать вот такой код в обрабочике EndRequest (или как его там)

if (Utils.CurrentSession != null)
{
Utils.CurrentSession.Close();
Utils.CurrentSession = null;
}

где мне хранить CurrentSession?
если можно приведите реализацию geter'а и setter'а
А то я что-то в MSDN про эти слоты ничего не понял....

Автор: arilou 12.5.2005, 13:19
Ты про прогу свою побольше расскажи - это ASP.NET или Forms приложение?

Автор: arilou 12.5.2005, 13:33
Вот код. Он подходит только для Windows.Forms приложений. Если интересно, почему - спрашивай:

Код

/// <summary>
/// Данное свойство позволяет сохранять и получать строковое значение в/из ThreadLocalStorage
/// текущего потока.
/// Результат ее выполнения будет разным при обращении к свойству из разных потоков
/// </summary>
public string ThreadLocalValue
{
    get
    {
        // получаем слот для данных. если его не было, он будет создан 
        // (вроде, иначе надо где-то вызвать Thread.AllocateNamedDataSlot)
        // "value" - это имя слота. Его выбираешь сам
        LocalDataStoreSlot slot = Thread.GetNamedDataSlot("value");
        // получаем значение
        object val = Thread.GetData(slot);

        // возвращаем результат
        if(val == null)
            return string.Empty;
        else
            return (string)val;
    }

    set
    {
        // тоже, что и в getter'е
        LocalDataStoreSlot slot = Thread.GetNamedDataSlot("value");

        // устанавливаем значение
        Thread.SetData(slot, value);
    }
}


Кстати, предлагаю зарегестрироваться и стать полноправным участником нашего форума.

Автор: iskan 12.5.2005, 14:34
Спасибо большое

Автор: stab 12.5.2005, 16:48
Цитата(arilou @ 12.5.2005, 09:44)
Еще как принесет - а если у тебя один поток (или несколько) обслуживают разных клиентов, тебе нужно сохранять-загружать локальную информацию.


Дык, все объекты созданные в контексте потока, а следовательно и данные в них уникальны для потока. Можно хранить эти объекты в полях, а можно в слотах, разницы НОЛЬ.

Автор: arilou 12.5.2005, 16:51
А если пул потоков?

Автор: stab 13.5.2005, 12:15
Тогда можно передать контекст для потока в качестве параметра. В общем, подходы взаимозаменяемые, просто, мне кажется, что работа с объектом-контекстом потока выглядит более прозрачно, чем использование слотов, но это только мое скромное мнение...

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