У меня есть статический класс со статическим свойством 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, который инициализируется при создании new Promotion() при создании new Promotion() при использовании Parallel.ForEach(), использует HttpContext.Current. Когда promo создается в рамках этого Parallel.ForEach(), HttpContext.Current - null, и поэтому new Promotion() вызывает исключение.
HttpContext.Current не является нулевым в статическом свойстве get, потому что он не вызывается до тех пор, пока его не использует (и поэтому существует HttpContext.Current).
Если Promotion использовал HttpContext.Current в своих экземплярах вместо своих статических членов, я мог бы просто передать HttpContext.Current в конструктор new Promotion():
var context = HttpContext.Current;
Parallel.ForEach(files, file =>
{
var promo = new Promotion(context);
});
Но так как static членам Promotion нужен HttpContext.Current, я не могу. Я мог бы, вероятно, перепроектировать класс Promotion, чтобы изменить статические члены, которым он нужен, чтобы быть членами экземпляра, но они являются статичными по какой-либо причине - было бы большой штраф за производительность, если бы все члены, которые были статичными, должны были быть определены вместо на каждом экземпляре каждый раз, когда был создан экземпляр new Promotion.
Каковы возможные обходные пути для этого? Я не понял, что HttpContext.Current будет пустым в пределах Parallel.ForEach().