Ich habe eine statische Klasse mit einer statischen get Eigenschaft, und in dieser Eigenschaft Ich tue dies:C#: Hinzufügen von Rahmen zu Parallel.ForEach() in ASP.NET
// property body
{
// HttpContext.Current is NOT null
...
Parallel.ForEach(files, file =>
{
// HttpContext.Current is null
var promo = new Promotion();
...
});
...
// HttpContext.Current is NOT null
}
Diese statische Klasse nicht Typinitialisierung durchlaufen, bis eine Sicht diese Eigenschaft verwendet.
Das Problem besteht darin, dass Promotion
‚s statischer Konstruktor, der das erste Mal initialisiert wird ein new Promotion()
innerhalb der Parallel.ForEach()
erstellt wird, HttpContext.Current
verwendet. Wenn promo
im Rahmen dieser Parallel.ForEach()
instanziiert wird, ist HttpContext.Current
null
, und new Promotion()
verursacht daher eine Ausnahme.
HttpContext.Current
ist nicht NULL innerhalb der statischen Get-Eigenschaft, weil es nicht aufgerufen wird, bis die Ansicht es verwendet (und es gibt daher eine HttpContext.Current
).
Wenn Promotion
verwendet HttpContext.Current
in seiner Instanzen anstelle seiner statischen Mitglieder, könnte ich wahrscheinlich nur HttpContext.Current
in den new Promotion()
Konstruktor übergeben:
var context = HttpContext.Current;
Parallel.ForEach(files, file =>
{
var promo = new Promotion(context);
});
Aber da static
Mitglieder der Promotion HttpContext.Current benötigen, kann ich nicht . Ich könnte wahrscheinlich die Promotion
Klasse ändern, um die statischen Mitglieder zu ändern, die es als Instanzmitglieder benötigen, aber sie sind aus einem Grund statisch - es würde eine große Leistungseinbuße geben, wenn alle Mitglieder, die statisch waren, stattdessen auf jedem definiert werden mussten Instanz jedes Mal ein new Promotion
wurde instanziiert.
Was sind die möglichen Problemumgehungen dafür? Ich habe nicht realisiert HttpContext.Current
wäre Null im Rahmen der Parallel.ForEach()
.
statische Mitglieder von Promotion werden nur einmal initialisiert, wenn der Code der Klasse zum ersten Mal berührt wird .... Wie können sie von 'HttpContext.Current' abhängen? –
Liegt der Quellcode für "Promotion" unter Ihrer Kontrolle? –