У меня есть статический класс со статическим свойством 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()
в 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
участникам Акции нужен HttpContext.Current, я не могу. Я мог бы, вероятно, изменить класс Promotion
, чтобы изменить статические члены, которые должны быть членами экземпляра, но они являются статическими по причине - было бы большое снижение производительности, если бы вместо этого были определены все члены, которые были статическими в каждом случае каждый раз, когда new Promotion
был создан.
Каковы возможные обходные пути для этого? Я не понимал, что HttpContext.Current
будет нулевым в пределах Parallel.ForEach()
.