我有一个静态类,其中包含一个静态的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()
中第一次创建 new Promotion()
时被初始化,并使用 HttpContext.Current
。 在此 Parallel.ForEach()
范围内实例化 promo
时,HttpContext.Current
为 null
,因此 new Promotion()
会引发异常。
HttpContext.Current
在静态获取属性中不为 null,因为它在视图使用它之前不会被调用(因此有一个HttpContext.Current
)。
如果 Promotion
在其实例中使用 HttpContext.Current
而不是其静态成员,则可能可以将 HttpContext.Current
传递到 new Promotion()
构造函数中:
var context = HttpContext.Current;
Parallel.ForEach(files, file =>
{
var promo = new Promotion(context);
});
但是由于Promotion类的静态成员需要HttpContext.Current,所以我做不到。我可能可以重新设计Promotion类,将需要它的静态成员更改为实例成员,但它们是静态的有其原因——如果所有静态成员都必须在每次实例化new Promotion时定义在每个实例上,那么就会存在大量的性能损耗。
有什么可能的解决办法?我没有意识到HttpContext.Current会在Parallel.ForEach()的范围内为空。
HttpContext.Current
? - user180326Promotion
的源代码是否在您的控制之下? - user180326