2010-05-27 20 views
6

मैं codeing के दिशा-निर्देश है कि मैं पढ़ा है से पता है कि तुमforeach पाश और कार्यों

for (int i = 0; i < 5; i++) 
{ 
    Task.Factory.StartNew(() => Console.WriteLine(i)); 
} 
Console.ReadLine(); 

ऐसा नहीं करना चाहिए के रूप में यह 5 में से 5 की लिखेंगे, मुझे लगता है कि समझते हैं और मुझे लगता है कि मैं समझता हूँ कि ऐसा क्यों हो रहा है। मुझे पता है कि समाधान सिर्फ

for (int i = 0; i < 5; i++) 
{ 
    int localI = i; 
    Task.Factory.StartNew(() => Console.WriteLine(localI)); 
} 
Console.ReadLine(); 

हालांकि ऐसा कुछ ठीक है?

foreach (MyClass myClass in myClassList) 
{ 
    Task.Factory.StartNew(() => myClass.DoAction()); 
} 
Console.ReadLine(); 

या मुझे वही काम करने की ज़रूरत है जो मैंने लूप में किया था।

foreach (MyClass myClass in myClassList) 
{ 
    MyClass localMyClass = myClass; 
    Task.Factory.StartNew(() => localMyClass.DoAction()); 
} 
Console.ReadLine(); 

उत्तर

6

यह foreach के साथ बिल्कुल वही समस्या है। निम्नलिखित:

foreach (MyClass myClass in myClassList) 
{ 
    MyClass localMyClass = myClass; 
    Task.Factory.StartNew(() => localMyClass.DoAction()); 
} 

लेकिन बजाय स्थानीय चर पर निर्भर की मैं सिफारिश करेंगे:

foreach (MyClass myClass in myClassList) 
{ 
    Task.Factory.StartNew(() => myClass.DoAction()); 
} 

संभवत: हमेशा सूची के अंतिम तत्व है, इस तरह से तय किया जा सकता है, जिस पर DoAction विधि लागू करेगा आप निम्नलिखित:

for (int i = 0; i < 5; i++) 
{ 
    Task.Factory.StartNew(localI => Console.WriteLine(localI), i); 
} 
+0

मैं वास्तव में मामले के लिए के बारे में परवाह नहीं है, मैं सिर्फ http://download.microsoft.com/download/B/C/F/BCFD4868-1354-45E3 से कोड कॉपी -B71B-B851CD78733D/ParallelPrograms inNET4_CodingGuidelines.pdf मैं वास्तव में केवल foreach मामले के बारे में जानना चाहता हूँ। इसके अलावा मेरा कोड जो मैंने पोस्ट किया उससे थोड़ा अधिक जटिल है। यह देखने के लिए कि मैं वास्तव में क्या कर रहा हूं, पिछले संशोधन को देखें। –

+0

यह 'foreach' के साथ एक ही बात है। –

+0

और न केवल यह और foreach के बीच समान है, लेकिन मूल्य और संदर्भ प्रकार के बीच। http://stackoverflow.com/questions/235455/access-to-modified-closure मैंने अभी तक एक दिन का बेहतर हिस्सा बिताया है जब तक कि एक सहयोगी ने मेरी त्रुटि को इंगित नहीं किया। –

संबंधित मुद्दे