2013-02-19 65 views
23

मैं कुछ प्रोसेसर भारी काम कर रहा था और हर बार जब मैं उस कमांड को निष्पादित करना शुरू करता हूं तो मेरा विनफॉर्म फ्रीज करता है, जब तक कि कार्य पूरा नहीं हो जाता तब तक मैं इसे चारों ओर स्थानांतरित नहीं कर सकता। मैंने माइक्रोसॉफ्ट से एक ही प्रक्रिया का इस्तेमाल किया लेकिन कुछ भी नहीं बदला जा रहा है।WinForms प्रदर्शन को बढ़ाने के लिए मैं async का उपयोग कैसे कर सकता हूं?

मेरे काम के माहौल .net 4,5

private async void button2_Click(object sender, EventArgs e) 
{ 
    Task<string> task = OCRengine();   
    rtTextArea.Text = await task; 
} 

private async Task<string> OCRengine() 
{ 
    using (TesseractEngine tess = new TesseractEngine(
      "tessdata", "dic", EngineMode.TesseractOnly)) 
    { 
     Page p = tess.Process(Pix.LoadFromFile(files[0])); 
     return p.GetText(); 
    } 
} 
+1

ऐसा लगता है कि अभी तक क्या इंतजार करता है से परिचित नहीं हैं। मेरा सुझाव है कि आप कुछ बुनियादी परिचय पढ़ें। उदाहरण के लिए, प्रतीक्षा थ्रेड शेड्यूल नहीं करता है। – usr

उत्तर

50

हाँ, तुम अब भी यूआई धागा पर सभी काम करते हैं उसमें दृश्य स्टूडियो 2012 है। async का उपयोग करके स्वचालित रूप से विभिन्न धागे पर काम को ऑफ़लोड नहीं किया जा रहा है। आप इस हालांकि कर सकता है:

private async void button2_Click(object sender, EventArgs e) 
{ 
    string file = files[0]; 
    Task<string> task = Task.Run(() => ProcessFile(file));  
    rtTextArea.Text = await task; 
} 

private string ProcessFile(string file) 
{ 
    using (TesseractEngine tess = new TesseractEngine("tessdata", "dic", 
                 EngineMode.TesseractOnly)) 
    { 
     Page p = tess.Process(Pix.LoadFromFile(file)); 
     return p.GetText(); 
    } 
} 

Task.Run के उपयोग मतलब यह होगा कि ProcessFile (काम के भारी टुकड़ा) एक अलग थ्रेड पर निष्पादित किया जाता है।

+4

+1। इसी नमूने के विस्तृत स्पष्टीकरण के साथ एक और लिंक - http://visualstudiomagazine.com/articles/2012/08/01/performance-tips.aspx –

+0

यह लाइन नहीं होना चाहिए 'कार्य कार्य = कार्य। रुन (() = > ProcessFile (फ़ाइल)); 'इस तरह बनें:' कार्य कार्य = कार्य। रुन (() => वापसी प्रक्रिया फ़ाइल (फ़ाइल)); '? – Prokurors

+2

@ प्रोकोकर्स: नहीं। अभिव्यक्ति-शरीर वाले लैम्ब्डा अभिव्यक्तियों में वापसी विवरण नहीं हैं। –

2

आप अपना काम नए धागे में शुरू करके भी कर सकते हैं। बस थ्रेड। स्टार्ट या थ्रेड का उपयोग करें। ParameterizedThreadStart

आपके संदर्भ के लिए इन देखें:

http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx

Start thread with parameters

+1

कार्य करने का यह नया तरीका है। वे थ्रेड के मुकाबले ज्यादा लचीला और सहज ज्ञान युक्त हैं। –