У меня есть статический класс со статическим свойством 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()
.