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

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

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

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

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

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

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

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

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

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

Спасибо
...
Рейтинг: 0 / 0
27.05.2008, 17:15
    #35338158
Andrej-V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
Я не понял вопроса, но если нужно сохранить изменяемую статическую переменную только в пределах одного запроса, мое ламерское ИМХО (на случай если не надо сохранять состояние сеанса).
Т.к. в 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
27.05.2008, 17:28
    #35338203
ХреноРедька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
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
27.05.2008, 19:57
    #35338628
Andrej-V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
ХреноРедька
Не гарантируется, что весь запрос от начала и до конца будет обрабатываться одним и тем же потоком. .
Разъясните пожалуйста, для этого надо специально как-то запрограммировать или и без этого может случиться.

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

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

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

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

----------------------------------------
Knowledge is P...O...w...E...R!
My site
...
Рейтинг: 0 / 0
28.05.2008, 20:10
    #35341380
Andrej-V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
Спасибо.
thread agility нашел. Но не нашел, как это работает, т.е. как делается синхронизация. Т.е. прежде чем замутить новый поток, в любом случае, вероятно, проверяется наличие переменных класса (и обращение к ресурсу) в кодах нового и старого потоков и, затем, если таковые находятся, вероятно, код дополняется синхронизацией. Что-то типа этого. По-другому, вроде, не получится. Почему при этом не проверяется наличие static переменных с атрибутом [ThreadStatic] (и без, которые можно использовать, как раньше использовалось состояние приложения) непонятно. Может это наследие тяжелого прошлого asp? Ну и если, конечно не проверяется, - в таком случае непонятно, как можно кое-как изловчиться и использовать thread-static переменные?
...
Рейтинг: 0 / 0
30.05.2008, 16:12
    #35346194
punches
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
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
Период между сообщениями больше года.
07.10.2013, 08:54
    #38418466
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
ХреноРедькаНе гарантируется, что весь запрос от начала и до конца будет обрабатываться одним и тем же потоком.
Для хранения информации в контексте одного запроса надо использовать уже упомянутую здесь коллекцию 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
07.10.2013, 09:57
    #38418506
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
Алексей К,
по моему вы можете увидеть эт если вы сделаете async / await для загрузки ресурсов к примеру с внешнего сервера. Выполнение вашего запроса остановиться пока не выполниться асинхронная операция, а потом возобновиться на первом попавшемся потоке из пула. Может у кого то есть примеры по лучше)
...
Рейтинг: 0 / 0
07.10.2013, 10:01
    #38418514
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
handmadeFromRuпо моему вы можете увидеть эт если вы сделаете async / awaitНу это само собой. Я про случай, когда в прикладном коде нет "асинхронностей".
...
Рейтинг: 0 / 0
07.10.2013, 10:10
    #38418521
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
Алексей К,
ну может примеры еще будут нагляднее)
но вы не правильно описали ситуацию. смотреть надо поток в Application_BeginRequest и Application_EndRequest. Внутри 1 экшена без async / await конечно не будет магии)
...
Рейтинг: 0 / 0
07.10.2013, 10:16
    #38418525
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
[quot handmadeFromRu
но вы не правильно описали ситуацию. смотреть надо поток в Application_BeginRequest и Application_EndRequest.[/quot]
Зачем лезть в хттп модуль или глобал асакс? Интересует конкретный метод контроллера и баста.
...
Рейтинг: 0 / 0
07.10.2013, 10:22
    #38418537
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
handmadeFromRuВнутри 1 экшена без async / await конечно не будет магииОк
...
Рейтинг: 0 / 0
07.10.2013, 10:25
    #38418540
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
МСУ,
затем что 1 реквест не равен 1 экшену как правило.
п.с. Алексей К у мен в голову приходят тока ситуации когда я сам разбиваю на таски задачу и потоки меняются
...
Рейтинг: 0 / 0
07.10.2013, 10:32
    #38418556
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение static полей класса между запросами
handmadeFromRuп.с. Алексей К у мен в голову приходят тока ситуации когда я сам разбиваю на таски задачу и потоки меняютсяАга, я понял, спасибо!
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Сохранение static полей класса между запросами / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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