2012-12-12 3 views
10

मैं एक वस्तु है कि एक System.Threading.Tasks.Task देता है:समांतर में सूची <Task> कैसे शुरू करें?

public class MyClass 
{ 
    public Task GetTask(object state, CancellationToken cancellationToken) 
    { 
     return new Task(Execute, state, cancellationToken); 
    } 

    public void Execute(object context) 
    { 
     //do stuff 
    } 
} 

कहीं और मैं एक List<MyClass> है, तो मैं एक List<Task> प्राप्त करने के लिए निम्न करें: कि मैं List<Task> है

var myTaskList = myClassList.Select(p => p.GetTask(null, cancellationToken)).ToList(); 

अब, कैसे कर सकते हैं मैं उन्हें समानांतर में शुरू करता हूं? क्या यह कोड करने के लिए एक और संक्षिप्त तरीका है?

धन्यवाद!

उत्तर

19

आप "उन्हें समानांतर में शुरू" से क्या मतलब है? जब आप Task चलाने के लिए, यह एक और धागा पर कार्यान्वित करता है, तो आप शायद बस मतलब है:

foreach(var task in myTaskList) 
{ 
    task.Start(); 
} 

लेकिन आप उनमें से बहुत सारे है कि आप एक और धागा शुरू तर्क ले जाना चाहते है, तो आप या तो कॉल कर सकते हैं कोड के ऊपर किसी अन्य धागे/कार्य में (मैं कम कोड के लिए का उपयोग कर रहा हूं)।

Task.Factory.StartNew(() => myTaskList.ForEach(task => task.Start())); 

या आप टीपीएल के Parallel.ForEach का उपयोग कर सकते हैं। यह तब तक निष्पादन धागे को अवरुद्ध कर देगा जब तक कि सभी कार्य शुरू नहीं हो जाते हैं, लेकिन यह आंतरिक थ्रेडपूल पर प्रारंभिक क्रिया को निष्पादित करेगा, इसलिए बड़ी संख्या में आइटम और कुछ मुफ्त CPU कोर/थ्रेड के लिए, यह काफी तेज़ी से बढ़ सकता है।

Parallel.ForEach(myTaskList, task => task.Start()); 
+1

धन्यवाद, 'समांतर। फॉरएच()' जो मैं खोज रहा था। – user833115xxx

+0

'समांतर। फॉरएच 'अभी भी वर्तमान थ्रेड को तब तक अवरुद्ध कर देगा जब तक कि यह इसके सभी पुनरावृत्तियों को पूरा नहीं कर लेता है। – davenewza

+0

आप सही हैं - सवाल काफी अस्पष्ट था, लेकिन मेरा जवाब भी है। वास्तव में समानांतर तरीका है (किसी भी) 'task.Start()' एक अलग धागे में लॉजिक (यानी थ्रेड ऑब्जेक्ट, लॉन्ग राइजिंग सृजन विकल्प के साथ कार्य, समानांतर। इन्वोक इत्यादि) –

6

मैं आपके प्रश्न को गलत समझ सकता हूं, लेकिन क्या यह सिर्फ हर कार्य पर कॉल करने के लिए नहीं है?

foreach(Task task in myTaskList) 
{ 
    task.Start(); 
} 

सभी कार्य पूरा होने की प्रतीक्षा:

Task.WaitAll(myTaskList.ToArray()); 
+2

या, लिंक के माध्यम से: myTaskList.ForEach (task => task.Start()); –

+0

मैं अपने कार्य पर समानांतर चलाने के लिए असमर्थ था। यह एक वादा-स्टाइल कार्य था; यह कार्य। WaitAll इसके बजाय मेरे लिए काम किया। – user2494584

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