powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Сохранение static полей класса между запросами
25 сообщений из 28, страница 1 из 2
Сохранение static полей класса между запросами
    #35336973
punches
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги,
у меня такой вопрос: разьве между разными вызовами должны сохраняться значения статических полей класса? И конструкторы тоже вызоваются лишь один раз, после чего на других запросах они больше не работают. Это нормально?

Подскажите, как лучше вмего сделать так, чтобы между запросами статических данные полей сбрасывались.
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35337048
topalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну а собственно чего ты хотел? читай про static и делай переменные не статическими.
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35337097
punches
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну а собственно чего ты хотел? читай про static и делай переменные не статическими.
хотел, чтобы они были статическими в пределах запроса. Разьве это не естесственное желание?
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35337125
topalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хотел, чтобы они были статическими в пределах запроса. Разьве это не естесственное желание?

Ну не знаю у всех желания разные... код покажи...
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35337377
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
punchesхотел, чтобы они были статическими в пределах запроса.
Данные относящие к кокретному запросу следует хранить в словаре HttpContext.Items.
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35337385
Radu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
punches:
Коллеги,
у меня такой вопрос: разьве между разными вызовами должны сохраняться значения статических полей класса? И конструкторы тоже вызоваются лишь один раз, после чего на других запросах они больше не работают. Это нормально?
Это нормальное поведение статических классов.

Подскажите, как лучше вмего сделать так, чтобы между запросами статических данные полей сбрасывались.
Зависит от того, что конкретно нужно сделать. Можно например определить обычный класс и объявить его экземпляр на объекте asp страницы.
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35337403
Фотография ХреноРедька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile punchesхотел, чтобы они были статическими в пределах запроса.
Данные относящие к кокретному запросу следует хранить в словаре HttpContext.Items.

подтверждаю
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35337464
punches
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
punches:
Коллеги,
у меня такой вопрос: разьве между разными вызовами должны сохраняться значения статических полей класса? И конструкторы тоже вызоваются лишь один раз, после чего на других запросах они больше не работают. Это нормально?
Это нормальное поведение статических классов.

Подскажите, как лучше вмего сделать так, чтобы между запросами статических данные полей сбрасывались.
Зависит от того, что конкретно нужно сделать. Можно например определить обычный класс и объявить его экземпляр на объекте asp страницы.

А нужно, чтобы в приложении была глобальная переменная. К странице не привяжешь, так как для всех страниц это должна быть одна и таже переменная.

Понятно. Спасибо. В общем, красивого способа нет.
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35337626
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
punchesА нужно, чтобы в приложении была глобальная переменная. К странице не привяжешь, так как для всех страниц это должна быть одна и таже переменная.
Для этого есть по меньшей мере два способа:
1) Создаем потомка класса System.Web.UI.Page с нужным полем. Затем наследуем все страницы от этого класса. Делаем это вручную или с через web.config (<pages pageBaseType="" />).
2) Создаем static класс с static свойством.

Данные, которые ты называешь статическими, храним в HttpContext.Items и инициализируем в событии BeginRequest или неявно при первом обращении в способах №1 и №2.
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35337754
punches
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
punchesА нужно, чтобы в приложении была глобальная переменная. К странице не привяжешь, так как для всех страниц это должна быть одна и таже переменная.
Для этого есть по меньшей мере два способа:
1) Создаем потомка класса System.Web.UI.Page с нужным полем. Затем наследуем все страницы от этого класса. Делаем это вручную или с через web.config (<pages pageBaseType="" />).
2) Создаем static класс с static свойством.

Данные, которые ты называешь статическими, храним в HttpContext.Items и инициализируем в событии BeginRequest или неявно при первом обращении в способах №1 и №2.

Спасибо
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35338158
Andrej-V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не понял вопроса, но если нужно сохранить изменяемую статическую переменную только в пределах одного запроса, мое ламерское ИМХО (на случай если не надо сохранять состояние сеанса).
Т.к. в Web для всех потоков создается только один экземляр статической переменной, на каждую статическую переменную поставить атрибут [ThreadStatic] и сделать новую инициализацию для каждого потока. Тогда в разных потоках они будут разными, такими как нужно. Т.е. примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
using System;
using System.Web;
using System.Collections.Generic;

public partial class _Default : System.Web.UI.Page
{
 protected void Page_Load(object sender, EventArgs e)
 {
//новая инициализация статических перменных (можно сделать и по-другому)
  Win w = new Win();
  w.func();
 }
}

class Win
{
 public class A
 {
  public List<int> list = new List<int>();
  public A() { }
 }
 [ThreadStatic]
 public static A a;
 [ThreadStatic]
 public static int i;

 public void func()
 {
  i++;
  a.list.Add( 1 );
 }
 public Win()
 {
  a = new A();
  i =  0 ;
 }
}
Кажется, так делать можно. Но может старшие товарищи поправят?
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35338203
Фотография ХреноРедька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrej-VЯ не понял вопроса, но если нужно сохранить изменяемую статическую переменную только в пределах одного запроса, мое ламерское ИМХО (на случай если не надо сохранять состояние сеанса).
Т.к. в Web для всех потоков создается только один экземляр статической переменной, на каждую статическую переменную поставить атрибут [ThreadStatic] и сделать новую инициализацию для каждого потока. Тогда в разных потоках они будут разными, такими как нужно. Т.е. примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
using System;
using System.Web;
using System.Collections.Generic;

public partial class _Default : System.Web.UI.Page
{
 protected void Page_Load(object sender, EventArgs e)
 {
//новая инициализация статических перменных (можно сделать и по-другому)
  Win w = new Win();
  w.func();
 }
}

class Win
{
 public class A
 {
  public List<int> list = new List<int>();
  public A() { }
 }
 [ThreadStatic]
 public static A a;
 [ThreadStatic]
 public static int i;

 public void func()
 {
  i++;
  a.list.Add( 1 );
 }
 public Win()
 {
  a = new A();
  i =  0 ;
 }
}
Кажется, так делать можно. Но может старшие товарищи поправят?

Не гарантируется, что весь запрос от начала и до конца будет обрабатываться одним и тем же потоком.
Для хранения информации в контексте одного запроса надо использовать уже упомянутую здесь коллекцию HttpContext.Items.
[ThreadStatic]- неудачное решение в контексте ASP.NET.
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35338628
Andrej-V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХреноРедька
Не гарантируется, что весь запрос от начала и до конца будет обрабатываться одним и тем же потоком. .
Разъясните пожалуйста, для этого надо специально как-то запрограммировать или и без этого может случиться.

ХреноРедька
Для хранения информации в контексте одного запроса надо использовать уже упомянутую здесь коллекцию HttpContext.Items.
[ThreadStatic]- неудачное решение в контексте ASP.NET.
Кто бы спорил. Хочется знать только почему это так?
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35339324
Фотография ХреноРедька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrej-V ХреноРедька
Не гарантируется, что весь запрос от начала и до конца будет обрабатываться одним и тем же потоком. .
Разъясните пожалуйста, для этого надо специально как-то запрограммировать или и без этого может случиться.

ХреноРедька
Для хранения информации в контексте одного запроса надо использовать уже упомянутую здесь коллекцию HttpContext.Items.
[ThreadStatic]- неудачное решение в контексте ASP.NET.
Кто бы спорил. Хочется знать только почему это так?

Да, это может случиться "само собой".
Это называется " thread agility ". (google => "asp.net thread agility" - объяснит подробнее).
Дело в том что "внутри себя" весь ASP.NET все равно работает асинхронно, и один и тот же реквест в принципе может обрабатываться разными потоками.

Несмотря на то, что можно кое-как изловчиться и использовать thread-static переменные, я тебе все же рекомендую использовать HttpContext.Items.
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35339415
C...R...a...S...H
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХреноРедька +1

----------------------------------------
Knowledge is P...O...w...E...R!
My site
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35341380
Andrej-V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
thread agility нашел. Но не нашел, как это работает, т.е. как делается синхронизация. Т.е. прежде чем замутить новый поток, в любом случае, вероятно, проверяется наличие переменных класса (и обращение к ресурсу) в кодах нового и старого потоков и, затем, если таковые находятся, вероятно, код дополняется синхронизацией. Что-то типа этого. По-другому, вроде, не получится. Почему при этом не проверяется наличие static переменных с атрибутом [ThreadStatic] (и без, которые можно использовать, как раньше использовалось состояние приложения) непонятно. Может это наследие тяжелого прошлого asp? Ну и если, конечно не проверяется, - в таком случае непонятно, как можно кое-как изловчиться и использовать thread-static переменные?
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #35346194
punches
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrej-V ХреноРедька
Не гарантируется, что весь запрос от начала и до конца будет обрабатываться одним и тем же потоком. .
Разъясните пожалуйста, для этого надо специально как-то запрограммировать или и без этого может случиться.

ХреноРедька
Для хранения информации в контексте одного запроса надо использовать уже упомянутую здесь коллекцию HttpContext.Items.
[ThreadStatic]- неудачное решение в контексте ASP.NET.
Кто бы спорил. Хочется знать только почему это так?

Да, это может случиться "само собой".
Это называется "thread agility". (google => "asp.net thread agility" - объяснит подробнее).
Дело в том что "внутри себя" весь ASP.NET все равно работает асинхронно, и один и тот же реквест в принципе может обрабатываться разными потоками.

Несмотря на то, что можно кое-как изловчиться и использовать thread-static переменные, я тебе все же рекомендую использовать HttpContext.Items.

В итоге получилось такое более-менее красивое решение:


class Task {
  public static Current
  {
    get {((Task)HttpContext.Current.Items["Task_Current"]);}
    set {HttpContext.Current.Items["Task_Current"] = value;}
  }
}
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Сохранение static полей класса между запросами
    #38418466
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХреноРедькаНе гарантируется, что весь запрос от начала и до конца будет обрабатываться одним и тем же потоком.
Для хранения информации в контексте одного запроса надо использовать уже упомянутую здесь коллекцию HttpContext.Items.
[ThreadStatic]- неудачное решение в контексте ASP.NET.Не понял. Каким чудом метод контроллера (если взять MVC), начнётся в одном потоке, а завершится в другом?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class MyController : Controller
{
    public void Execute()
    {
         var tid = Thread.CurrentThread.ManagedThreadID;

         // Что тут должно быть написано, чтобы случилось чудо?

         if (tid != Thread.CurrentThread.ManagedThreadID)
             throw new Exception("Случилось чудо.");
    }
}
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #38418506
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
по моему вы можете увидеть эт если вы сделаете async / await для загрузки ресурсов к примеру с внешнего сервера. Выполнение вашего запроса остановиться пока не выполниться асинхронная операция, а потом возобновиться на первом попавшемся потоке из пула. Может у кого то есть примеры по лучше)
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #38418514
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRuпо моему вы можете увидеть эт если вы сделаете async / awaitНу это само собой. Я про случай, когда в прикладном коде нет "асинхронностей".
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #38418521
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
ну может примеры еще будут нагляднее)
но вы не правильно описали ситуацию. смотреть надо поток в Application_BeginRequest и Application_EndRequest. Внутри 1 экшена без async / await конечно не будет магии)
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #38418525
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot handmadeFromRu
но вы не правильно описали ситуацию. смотреть надо поток в Application_BeginRequest и Application_EndRequest.[/quot]
Зачем лезть в хттп модуль или глобал асакс? Интересует конкретный метод контроллера и баста.
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #38418537
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRuВнутри 1 экшена без async / await конечно не будет магииОк
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #38418540
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
затем что 1 реквест не равен 1 экшену как правило.
п.с. Алексей К у мен в голову приходят тока ситуации когда я сам разбиваю на таски задачу и потоки меняются
...
Рейтинг: 0 / 0
Сохранение static полей класса между запросами
    #38418556
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRuп.с. Алексей К у мен в голову приходят тока ситуации когда я сам разбиваю на таски задачу и потоки меняютсяАга, я понял, спасибо!
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Сохранение static полей класса между запросами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]