मुझे पता चला कि एंटीटी फ्रेमवर्क में आलसी लोडिंग केवल उस थ्रेड से काम करती है जिसने ObjectContext
बनाया है। समस्या को समझाने के लिए, मैंने एक साधारण परीक्षण किया, जिसमें एक साधारण मॉडल है जिसमें केवल 2 इकाइयां हैं: Person
और Address
। Address
संपत्ति lazily भरी हुई हैइकाई फ्रेमवर्क आलसी लोडिंग अन्य धागे से काम नहीं करती
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);
});
}
}
}
TestSingleThread
विधि ठीक काम करता है, यहाँ कोड है। लेकिन TestMultiThread
में, मुझे p2.Address.City
पर NullReferenceException
मिलता है, क्योंकि p2.Address
शून्य है।
यह एक बग है? क्या यह काम करने वाला तरीका है? यदि हां, तो क्या कोई दस्तावेज इसका उल्लेख कर रहा है? मुझे एमएसडीएन या Google पर इस विषय पर कुछ भी नहीं मिला ...
और सबसे महत्वपूर्ण बात यह है कि क्या कोई कामकाज है?
किसी भी मदद की बहुत सराहना की जाएगी जा
पी एस (स्पष्ट रूप से कार्यकर्ता धागे से LoadProperty
बुला ... के अलावा अन्य): मैं VS2010 का उपयोग कर रहा है, इसलिए यह एफई 4.0 है। मुझे नहीं पता कि यह ईएफ के पिछले संस्करण में समान था ...
मुझे आपकी प्रेरणा के बारे में निश्चित नहीं है, लेकिन .NET टीम थ्रेड पूल के स्पष्ट उपयोग के बजाय कार्य और कार्य के साथ कोड को प्रोत्साहित करने के लिए प्रोत्साहित करती है। शायद कोई उस का एक अच्छा उद्धरण प्रदान कर सकता है? –
क्या आप थोड़ा 'पी 2' के उपयोग पर विस्तार कर सकते हैं? मुझे लगता है कि यह कुछ भी नहीं बदला है? –
@jarrett: शायद, लेकिन यह बात नहीं है ... समस्या एक कार्य के साथ समान होती, क्योंकि यह वैसे भी धागे का उपयोग करती है। @ हेनक: यह 'पी 2' के बिना या तो काम नहीं करता है, लेकिन वैसे भी यह आवश्यक है, अन्यथा प्रत्येक लैम्ब्डा एक ही चर पर बंद हो जाएगा; विवरण के लिए यह आलेख देखें: http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-Considered-harmful.aspx –