2011-03-26 12 views
7

मैं थोड़ी देर के अंदर टीपीएल का उपयोग करने की कोशिश कर रहा हूं और मुझे कुछ मानों को पास करने की आवश्यकता है जो लूप में बदल जाते हैं। उदाहरण के लिए, यहाँ यह एक सूचकांक कि वृद्धि की जाती है (जरूरी लाइन में जो कार्य निर्माण अनुरोध किया जाता है के बाद) के साथ एक उदाहरण दिखाया गया है:लूप के अंदर कार्य शुरू करना: लूप के अंदर मूल्यों को कैसे पास किया जा सकता है?

int index = 0; 
Task[] tasks; 
while(/*condition*/) 
{ 
    tasks[index] = Task.Factory.StartNew(() => DoJob(index)); 
    index++; 
} 

लेकिन निश्चित रूप से यह काम नहीं करता है, क्योंकि सूचकांक मान हो सकता है कार्य शुरू होने से पहले वृद्धि हुई। एक संभावित समाधान एक वेटहैंडल को पास करने के लिए भी हो सकता है जिस पर सूचकांक में वृद्धि से पहले इंतजार करना पड़ता है और इसे DoJob विधि में संकेत दिया जाना चाहिए, लेकिन यह मुझे वास्तव में एक अच्छा समाधान प्रतीत नहीं होता है। कोई अन्य विचार?

उत्तर

15

पाश अंदर एक अस्थायी चर के लिए मान निर्दिष्ट करें:

int index = 0; 
Task[] tasks; 
while(/*condition*/) 
{ 
    int value = index; 
    tasks[index] = Task.Factory.StartNew(() => DoJob(value)); 
    index++; 
} 
इस तरह प्रत्येक कार्य मूल्य की अपनी एक प्रतिलिपि index while पाश की यात्रा है, जिसमें StartNew करने के लिए कॉल के दौरान किया था कि होगा

था बनाया गया।

+0

रिफैक्टर हमेशा यह सीधा नहीं हो सकता है, लेकिन हमेशा संभव होना चाहिए - नेस्टेड लूप पर बाक न करें:] –

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