Tôi có một lớp tĩnh với một tài sản get tĩnh, và trong khách sạn này, tôi làm điều này:C#: Thêm ngữ cảnh để Parallel.ForEach() trong 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
}
lớp tĩnh này không đã khởi tạo kiểu cho đến khi chế độ xem sử dụng thuộc tính này.
Vấn đề là Promotion
của hàm tạo tĩnh, được khởi tạo lần đầu tiên new Promotion()
được tạo trong phạm vi Parallel.ForEach()
, sử dụng HttpContext.Current
. Khi promo
được khởi tạo trong phạm vi của Parallel.ForEach()
, HttpContext.Current
này là null
và new Promotion()
do đó gây ra ngoại lệ.
HttpContext.Current
không phải là rỗng trong thuộc tính tĩnh nhận bởi vì nó không được gọi cho đến khi chế độ xem sử dụng nó (và do đó có một HttpContext.Current
).
Nếu Promotion
sử dụng HttpContext.Current
trong trường hợp của mình thay vì các thành viên tĩnh của nó, tôi có thể có lẽ chỉ cần vượt qua HttpContext.Current
vào new Promotion()
constructor:
var context = HttpContext.Current;
Parallel.ForEach(files, file =>
{
var promo = new Promotion(context);
});
Nhưng kể từ static
thành viên Xúc tiến cần HttpContext.Current, tôi không thể . Tôi có thể thiết kế lại lớp Promotion
để thay đổi các thành viên tĩnh cần nó là thành viên cá thể, nhưng chúng tĩnh vì lý do - sẽ có một hình phạt hiệu suất lớn nếu tất cả các thành viên tĩnh phải được xác định thay vào mỗi mỗi lần một số new Promotion
được khởi tạo.
Giải pháp có thể có cho điều này là gì? Tôi đã không nhận ra HttpContext.Current
sẽ là không trong phạm vi Parallel.ForEach()
.
thành viên tĩnh của khuyến mãi sẽ được khởi tạo chỉ một lần, khi mã của lớp được chạm lần đầu tiên .... Làm thế nào chúng có thể phụ thuộc vào 'HttpContext.Current'? –
Mã nguồn cho 'Khuyến mãi' dưới sự kiểm soát của bạn? –