2015-04-16 10 views
7

मैं समानांतर धागे को बढ़ाने के लिए कार्य कारखाने का उपयोग कर रहा हूं और मेरा कोड नीचे जैसा है। मुझे प्रत्येक धागे के समापन समय को मुद्रित करने की आवश्यकता है लेकिन यह नहीं पता कि प्रत्येक धागे की जांच कैसे करें। वर्तमान में मेरा कोड सभी कार्यों को समाप्त करने और फिर समय की गणना करने का इंतजार कर रहा है।कार्य कारखाने का उपयोग करके प्रत्येक कार्य के कार्य पूर्ण होने का समय संग्रहीत करना

stp1.Start(); 
     for (int i = 0; i < tsk.Length; i++) 
     { 
      tsk[i] = Task.Factory.StartNew((object obj) => 
      { 
       resp = http.SynchronousRequest(web, 443, true, req); 
      }, i); 
     } 
     try 
     { 
      Task.WaitAll(tsk); 
     } 
     stp1.Stop(); 

उत्तर

7

आप Task पर निरंतरता जोड़ सकते हैं। निरंतरता एक विधि है जिसे दिया जाएगा जब दिया गया Task पूरा हो गया है।

for (int i = 0; i < tsk.Length; i++) 
{ 
    tsk[i] = Task.Factory.StartNew((object obj) => 
    { 
     resp = http.SynchronousRequest(web, 443, true, req); 
    }, i); 

    tsk[i].ContinueWith(antecedent=> 
    { 
     //antecedent is completed 
     //Do whatever here     
    }); 
} 

यदि आपको व्यक्तिगत कार्य करने की आवश्यकता है, तो आपको प्रति कार्य एक स्टॉपवॉच की आवश्यकता है। आप StartNew के अंदर StopWatch शुरू कर सकते हैं और इसे ContinueWith पर रोक सकते हैं।

यदि यह आपका वास्तविक कोड है, तो आप बस उस सिंक्रोनस ऑपरेशन का समय निकाल सकते हैं जिसे आप आमंत्रित करते हैं (http.SynchronousRequest इस मामले में)। उदाहरण के लिए निम्नलिखित कोड पर्याप्त है।

for (int i = 0; i < tsk.Length; i++) 
{ 
    tsk[i] = Task.Factory.StartNew((object obj) => 
    { 
     StopWatch watch = StopWatch.StartNew(); 

     resp = http.SynchronousRequest(web, 443, true, req); 

     watch.Stop(); 
     Console.WriteLine(watch.Elapsed); 
    }, i); 
} 

बीटीडब्ल्यू, नेटवर्क ऑपरेशंस स्वाभाविक रूप से असीमित हैं; एसिंक्रोनस एपीआई उपलब्ध होगा, आप कार्य में सिंक्रोनस वेब अनुरोध को लपेटने के बजाय इसका उपयोग कर सकते हैं। उदाहरण के लिए, शायद HttpClient.SendAsync

1

मैं यह कहकर शुरू कर दूंगा कि आपको एसिंक आईओ बाध्य संचालन निष्पादित करने के लिए थ्रेडपूल धागे की आवश्यकता नहीं है। Task.Factory.StartNew का उपयोग करने के बजाय, स्वाभाविक रूप से एसिंक्रोनस एपीआई जैसे कि HttpClient ऑफ़र का उपयोग करें, उदाहरण के लिए।

फिर, मैं कहना चाहता हूँ आप Task.WhenAny का उपयोग अपने कार्यों में से प्रत्येक के पूरा होने पर प्रतीक्षा करने के लिए कर सकते हैं के रूप में वे खत्म:

// Note I'm assuming some kind of async implementation which returns a Task<T> 
var tasks = tsk.Select(req => http.AsyncRequest(web, 443, true, req)); 

while (tasks.Count > 0) 
{ 
    var finishedTask = await Task.WhenAny(tasks); 
    // Do something with finishedTask 

    tasks.Remove(finishedTask); 
} 
संबंधित मुद्दे