Tôi vừa phát hiện ra rằng tải chậm trong Khuôn khổ thực thể chỉ hoạt động từ chuỗi tạo ra ObjectContext
. Để minh họa cho vấn đề này, tôi đã làm một bài kiểm tra đơn giản, với một mô hình đơn giản chỉ chứa 2 thực thể: Person
và Address
. Dưới đây là các mã:Tải xuống khuôn khổ thực thể không hoạt động từ chủ đề khác
private static void TestSingleThread()
{
using (var context = new TestDBContext())
{
foreach (var p in context.Person)
{
Console.WriteLine("{0} lives in {1}.", p.Name, p.Address.City);
}
}
}
private static void TestMultiThread()
{
using (var context = new TestDBContext())
{
foreach (var p in context.Person)
{
Person p2 = p; // to avoid capturing the loop variable
ThreadPool.QueueUserWorkItem(
arg =>
{
Console.WriteLine("{0} lives in {1}.", p2.Name, p2.Address.City);
});
}
}
}
Phương pháp TestSingleThread
hoạt động tốt, tài sản Address
được lười biếng nạp. Nhưng trong TestMultiThread
, tôi nhận được NullReferenceException
trên p2.Address.City
, vì p2.Address
là không có.
Đó là lỗi? Đây có phải là cách nó phải làm việc? Nếu có, có tài liệu nào đề cập đến nó không? Tôi không thể tìm thấy bất kỳ nội dung nào về chủ đề này trên MSDN hoặc Google ...
Và quan trọng hơn, có cách giải quyết khác không? (Trừ gọi một cách rõ ràng LoadProperty
từ các sợi nhân ...)
Bất kỳ trợ giúp sẽ rất cảm kích
PS: Tôi đang sử dụng VS2010, vì vậy nó là EF 4.0. Tôi không biết nếu nó giống nhau trong phiên bản trước của EF ...
Tôi không chắc về động cơ của bạn, nhưng nhóm .NET nối mã khuyến khích viết bằng Tác vụ và Hành động thay vì sử dụng rõ ràng hồ bơi chuỗi. Có lẽ ai đó có thể cung cấp một trích dẫn tốt về điều đó? –
Bạn có thể giải thích về việc sử dụng 'p2' một chút không? Tôi đoán nó không thay đổi gì cả? –
@ jarrett: có lẽ, nhưng nó không phải là vấn đề ... vấn đề sẽ giống với Task, vì nó vẫn sử dụng các luồng. @ Henk: nó không hoạt động hoặc không có 'p2', nhưng dù sao thì cũng cần thiết, nếu không mỗi lambda sẽ đóng trên cùng một biến; xem bài viết này để biết chi tiết: http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx –