2010-01-19 15 views
5

क्या आपके पास एक लंबे समय तक चलने वाला कार्य करने के दौरान 'कृपया प्रतीक्षा करें' Winform 'चित्रित' रखने के लिए एक अच्छा समाधान है?लंबे समय तक चलने वाले कार्यों पर विनफॉर्म अपडेट

मैंने प्रत्येक चरण पर form.refresh() का उपयोग करने का प्रयास किया है, लेकिन कुछ लंबे समय तक चलने वाले प्रश्न हैं, जिसका अर्थ यह है कि यह अक्सर पर्याप्त नहीं होता है।

असल में यह SO Question लेकिन, VSTO (पायथन के बजाए) के माध्यम से एक्सेल में सी # पर।

+0

यह वास्तव में वेब रूपों है, या इस WinForms है? आप एक्सेल और वीएसटीओ के बारे में बात कर रहे हैं। और यदि यह वेबफॉर्म है, तो आपके पास रीफ्रेश विधि नहीं है। –

+0

क्षमा करें, हाँ, Winforms, वेबफॉर्म नहीं .. सवाल संपादित किया है ... यह एक लंबा दिन रहा है ... –

+0

पूर्ण स्रोत कोड नमूना के साथ कोई अंतिम समाधान? सी #, सिग्नलआर का उपयोग कर चरणों के साथ लंबी चल रही प्रक्रिया का उपयोग करने के बारे में क्या? – Kiquenet

उत्तर

1

सी # में कोड के साथ Here's a good example

यह विशेष रूप से स्पलैश स्क्रीन के लिए है, हालांकि कृपया प्रतीक्षा विंडो बनाने के लिए लगभग समान प्रक्रिया (शायद कुछ चमकदार अस्पष्टता से कम) है।

मुख्य जानकारी यह है कि आपको एक अलग थ्रेड की आवश्यकता होगी। यह चीजों को जटिल बना सकता है हालांकि आलेख एक अच्छा कवरेज/उदाहरण देता है कि इसे सही तरीके से कैसे किया जाए।

+0

इस लिंक के लिए धन्यवाद। वास्तव में अच्छी तरह से काम करता है, और वास्तव में अच्छी तरह से मेरे एक्सेल वीएसटीओ ऐप में एकीकृत करता है! –

1

उपयोग एक BackgroundWorker

+0

मैन मैं थक गया हूँ - मैंने सोचा कि यह Winforms था। जवाब AJAX का उपयोग करना चाहिए (एमएस AJAX ठीक काम करेगा)। आप स्थिति की जांच के लिए टाइमर नियंत्रण का उपयोग कर सकते हैं। फिर आप पूरा होने पर पुनर्निर्देशित कर सकते हैं। – hackerhasid

+0

एमएसडीएन लिंक: http://msdn.microsoft.com/en-us/magazine/cc164051.aspx – hackerhasid

+0

डाउनवोट के लिए खेद है, वेबफॉर्म => Winforms से प्रश्न बदल दिया गया था। –

0

एक और विकल्प थ्रेडपूल थ्रेड पर फ़ॉर्म दिखाने के लिए एसिंक्रोनस प्रतिनिधि का उपयोग करना है।

थ्रेडपूल में थ्रेड छोटे रहने वाले धागे के लिए अनुशंसित हैं जो पूरे आवेदन अवधि के लिए नहीं टिकते हैं। चूंकि यह एक अल्पकालिक प्रदर्शित करने के लिए है कृपया विंडो की प्रतीक्षा करें, थ्रेडपूल एक उचित विकल्प है।

एक्शन प्रतिनिधि (.NET 2.0+) का उपयोग थ्रेडपूल थ्रेड पर स्वचालित रूप से प्रतिनिधि कोड चलाने के लिए इसके BeginInvoke() विधि के साथ किया जाता है।

कुछ नोट:

  • यह ClosePleaseWait में कृपया प्रतीक्षा करें प्रपत्र बंद करने के रूप में किसी भी पार धागा जीयूआई कॉल, के लिए Control.BeginInvoke उपयोग करने के लिए महत्वपूर्ण है()।
  • इसके अलावा, m_pleaseWaitForm.ShowDialog(); वास्तव में नए धागे में एक नया संदेश पाश शुरू करता है। यह वही है जो कृपया जीवित प्रतीक्षा फार्म रखता है।
  • क्योंकि थ्रेडपूल थ्रेड का उपयोग किया जाता है, यह धागा स्वचालित रूप से पृष्ठभूमि धागा होता है और मुख्य एप्लिकेशन बंद होने पर समाप्त कर दिया जाएगा।
  • किसी अन्य धागे पर चलने के अलावा, फॉर्म 2 के बारे में कुछ खास नहीं है। आप किसी भी बच्चे के नियंत्रण जैसे कि पिक्चरबॉक्स, लेबल इत्यादि रख सकते हैं।
  • (MethodInvoker)delegate { ... } एक प्रतिनिधि इनलाइन में कोड चलाने का सिर्फ एक .NET 2.0 तरीका है।

नीचे दिया गया उदाहरण फॉर्म 1: मुख्य फॉर्म, और फॉर्म 2 युक्त विनफॉर्म प्रोजेक्ट में जोड़ा जा सकता है: कृपया प्रतीक्षा करें फॉर्म।

private Form2 m_pleaseWaitForm = null; 

    private void Form1_Shown(object sender, EventArgs e) 
    { 
     // This code could also be placed in eg. a button click event handler. 

     Action<Rectangle> a = new Action<Rectangle>(ShowPleaseWait); 

     a.BeginInvoke(this.Bounds, null, null); 

     // Do your long running tasks 

     ClosePleaseWait(); 
    } 


    private void ShowPleaseWait(Rectangle bounds) 
    { 
     // This method runs on the new thread. 

     m_pleaseWaitForm = new Form2(); 

     m_pleaseWaitForm.TopMost = true; 
     m_pleaseWaitForm.Location = new Point(bounds.Left + bounds.Width/2 - m_pleaseWaitForm.Width/2, bounds.Top + bounds.Height/2 - m_pleaseWaitForm.Height/2); 

     m_pleaseWaitForm.ShowDialog(); 

    } 

    private void ClosePleaseWait() 
    { 
     m_pleaseWaitForm.BeginInvoke((MethodInvoker)delegate { m_pleaseWaitForm.Close(); }); 
    } 
3

जैसा कि स्टेटिचिपो ने उल्लेख किया है, मैं पृष्ठभूमिवर्कर कक्षा का उपयोग करूंगा। इसका उद्देश्य मल्टी-थ्रेडिंग को सरल बनाना है और एक कार्यकर्ता थ्रेड को जीयूआई लॉक किए बिना समय लेने वाली प्रसंस्करण करने की अनुमति देना है।

BackgroundWorker वर्ग आप एक अलग, समर्पित धागे पर एक ऑपरेशन को चलाने के लिए अनुमति देता है:

यहाँ MSDN से एक उद्धरण है।समय लेने वाली डाउनलोड और डेटाबेस जैसे ऑपरेशन लेन-देन आपके उपयोगकर्ता इंटरफ़ेस (UI) को ऐसा लगता है कि ने चल रहे हैं, जबकि प्रतिक्रिया देना बंद कर दिया है। जब आप एक उत्तरदायी यूआई चाहते हैं और आपको ऐसे परिचालनों से जुड़े लंबी देरी का सामना करना पड़ रहा है, तो पृष्ठभूमिवर्कर वर्ग सुविधाजनक समाधान प्रदान करता है। Implementing multi-threading in WinForms using the BackgroundWorker class

वहाँ जटिल परिदृश्यों के लिए सी # में लेकिन सबसे सरल परिदृश्यों के लिए मल्टी-थ्रेडिंग लागू करने के लिए और अधिक जटिल तरीके हैं BackgroundWorker महान काम करता है:

यहाँ एक अच्छा ट्यूटोरियल कैसे खिड़कियों रूपों में BackgroundWorker वर्ग का उपयोग करने के लिए है (मेरे लिए कम से कम)।

ये कुछ लिंक सी # मल्टी थ्रेडिंग पर मैं गूगल से खींचा हैं:
MSDN Threading
Introduction to Multithreading in C#

+0

कोई पूर्ण स्रोत कोड नमूना? – Kiquenet

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