Является ли ThreadLocal в ASP.NET эквивалентной переменной для каждого запроса? - PullRequest
2 голосов
/ 07 мая 2011

Я использую переменную ThreadLocal в ASP.NET HttpHandler. Я предполагал, что это приведет к новой переменной для запроса.

У меня странное поведение в приложении. Когда переменная ThreadLocal создается и располагается на странице ASP.NET?

Что произойдет, если этот же поток позже будет использован ASP.NET для другого запроса? Приводит ли это к новой переменной ThreadLocal или будет использоваться ранее созданное значение (которое использовалось с другим запросом)?

Если переменные ThreadLocal располагаются, когда поток фактически расположен, то мое предположение не выполняется с ASP.NET (поскольку потоки возвращаются в пул и не являются уникальными для запроса)

Ответы [ 2 ]

4 голосов
/ 07 мая 2011

ASP.NET может и будет повторно использовать потоки между запросами - фактически, если память обслуживает, он использует поток из обычного пула потоков .NET для каждого запроса. Возможно, вам лучше использовать состояние сеанса.

0 голосов
/ 09 ноября 2017

Попробуйте с этим:

public class WebRequestLocal<T>
{
    private readonly Func<T> _getter;
    private readonly object _id = new object();

    public WebRequestLocal(Func<T> getter)
    {
        _getter = getter;
    }


    public T Value
    {
        get
        {
            HttpContext httpContext = HttpContext.Current;
            if(httpContext == null)
                throw new Exception("HttpContext unavailable.");

            if (httpContext.Items.Contains(_id))
                return (T)httpContext.Items[_id];


            return (T)(httpContext.Items[_id] = _getter());
        }
    }
}
...