C #: Добавление контекста в Parallel.ForEach () в ASP.NET

У меня есть статический класс со статическим свойством get, и в это свойство, я делаю следующее:

// property body
{
    // HttpContext.Current is NOT null
    ...

    Parallel.ForEach(files, file =>
    {
        // HttpContext.Current is null
        var promo = new Promotion();
        ...
    });
    ...

    // HttpContext.Current is NOT null
}

Этот статический класс не подвергается инициализации типа, пока представление не использует это свойство.

Проблема в том, что статический конструктор Promotion инициализируется первым когда новое продвижение () создается в Parallel.ForEach () , используется HttpContext.Current . Когда промо создается в область этого Parallel.ForEach () , HttpContext.Current равно null , и поэтому new Promotion () вызывает исключение.

HttpContext.Current не имеет значения NULL в статическом свойстве get, потому что он не вызывается до тех пор, пока представление не использует его (и поэтому существует HttpContext.Current ).

Если бы Продвижение использовало HttpContext.Current в своих экземплярах вместо статических элементов, я, вероятно, мог бы просто передать HttpContext.Current в новый Конструктор Promotion () :

 var context = HttpContext.Current;
 Parallel.ForEach(files, file =>
 {
     var promo = new Promotion(context);
 });

Но поскольку static членам Promo требуется HttpContext.Current, я не могу. Я мог бы, вероятно, перепроектировать класс Promotion , чтобы изменить статические члены, которым он нужен, чтобы они были членами экземпляра, но они статичны по какой-то причине - если бы все статические члены имели вместо этого будет определяться в каждом экземпляре каждый раз, когда создается новый экземпляр Promotion .

Каковы возможные обходные пути для этого? Я не понимал, что HttpContext.Current будет нулевым в рамках Parallel.ForEach () .

12
задан abatishchev 27 September 2010 в 12:15
поделиться