статические методы и стек вызовов в IIS / asp.net - PullRequest
3 голосов
/ 09 октября 2009

Теоретический вопрос. Если у вас есть 100 отдельных запросов на веб-страницу aspx, которая вызывает статический метод ниже.

    public static GeocodeResult GeocodeQuery(string query)
    {
        int train, tube, dlr = 0;

        // manipulate these ints
        if (train)
        {
            // do something important
        }

    }

У каждого запроса есть отдельный стек вызовов?

Если так - Этот статический метод вызывается в этих отдельных стеках вызовов?

Если так - Следовательно, эти целые потоки безопасны? то есть. 100 запросов, 100 кадров вызовов, 300 дюймов.

Приветствия

Ответы [ 3 ]

6 голосов
/ 09 октября 2009

Да, у каждого запроса есть свой стек вызовов. И каждый стек будет содержать свои собственные значения для запроса, поезда, трубки, dir , поскольку локальные переменные и параметры метода хранятся в стеке.

Таким образом, если вы не обращаетесь к какому-либо общему состоянию, этот метод является поточно-ориентированным.

1 голос
/ 14 октября 2009

Обратите внимание, что метод не имеет стека вызовов - у потока есть стек вызовов. Методы вызываются потоком.

Если метод не встроен, его вызов может выдвинуть параметры в стек вызовов, но определенно передаст адрес возврата в стек вызовов.

Каждый стек вызовов потока не зависит от стека вызовов любого другого потока. Если доступен только стек, метод является поточно-ориентированным.

Можно получить доступ к другому хранилищу, чтобы сделать метод не поточно-ориентированным. Это включает в себя статические данные и данные экземпляров, а также объекты, на которые они ссылаются. Статический метод не имеет доступа к данным экземпляра, что делает его более потокобезопасным. Вам нужно только следить за доступом к статическим данным или объектам, на которые ссылаются статические данные:

private static int _balance;
private static void ThreadSafetyIssues()
{
    // Not thread  safe
    int temp = _balance;
    temp ++;
    _balance = temp;

    // Not thread safe
    temp = (int) HttpContext.Current.Session["balance"];
    temp ++;
    HttpContext.Current.Session["balance"] = temp;
}

Свойство HttpContext.Current является статическим. Это означает, что любой поток может получить доступ к контексту одновременно, включая Session. Это так же не поточнобезопасно, как простое статическое поле _balance выше.

1 голос
/ 09 октября 2009

Все статические методы являются поточно-ориентированными, если используются только локальные переменные или параметры.

...