2013-08-12 15 views
5

मुझे कोई सफलता के साथ थोड़ी देर के लिए मेरी विशेष समस्या के लिए एक जवाब के लिए खोज की है में बनाई गई है समापन।एक रूप है कि एक और धागा

मैं अपने प्रोग्राम है जो कुछ ही सेकंड लगते में एक कार्य है और मैं एक नए रूप को दिखाने के लिए है, जबकि उस कार्य किया जा रहा है चाहता हूँ। नए रूप में एक लोडिंगबार और कुछ पाठ है।

मैं काम करने के लिए नए रूप समानांतर दिखाने के लिए अन्यथा कार्य तक मैं नए रूप को बंद शुरू नहीं होगी की जरूरत है।

यह समाधान है मैं अब है:

private void loadingBar() 
{ 
    frmLoading frm = new frmLoading("Please wait while the database is being backed up", "This might take several days."); 
    frm.ShowDialog(); 

} 

public void Backup() 
{ 
    Thread load = new Thread(new ThreadStart(loadingBar)); 
    load.Start(); 

    ///Execute a task. 

    load.Abort(); 
} 

तो, यह ठीक काम करता है, लेकिन मेरा सवाल यह है: लोड सूत्र में फार्म "frm" बंद करने के लिए नहीं यह बेहतर होगा बनाने के लिए यह रुकता है?

+1

एक प्रगति बार की तरह व्यवहार यह काम करता है। जिस फ़ॉर्म को आप दिखाना चाहते हैं उसके लिए पृष्ठभूमि थ्रेड सबवेरिएन्ट के रूप में "प्रक्रिया" चलाएं। फिर उस फॉर्म को "मुख्य" थ्रेड से कॉल करें। मुख्य धागा आपके लोडिंग फॉर्म को दिखाएगा, जबकि लोडिंग फॉर्म पृष्ठभूमि थ्रेड के रूप में कुछ चलाता है। इस तरह लोडिंग फॉर्म स्वयं प्रक्रिया को ट्रैक कर सकता है और इसे खत्म होने के बाद खुद को बंद कर सकता है। – Nevyn

+3

@ डेव क्यों न केवल 'BackgroundWorker' का उपयोग करें? इसके अलावा - आप थ्रेड के लिए उस कोड को 'उपयोग()' कथन में रखने पर विचार करना चाहेंगे, फिर यह पूरा होने पर स्वयं को निपटान करेगा। – Hexie

+1

यह मौलिक रूप से गलत काम है। कार्यकर्ता थ्रेड पर यूआई प्रदर्शित करने के लिए कई बहुत ही खराब विफलता मोड हैं।आपको इसे दूसरी तरफ करने की ज़रूरत है, यूआई थ्रेड पर "लोडिंग" विंडो प्रदर्शित करें, वर्कर थ्रेड पर बैकअप करें। –

उत्तर

1

आप क्लास लेवल पर प्रपत्र की घोषणा और बाद में एक आह्वान के साथ इसे बंद कर सकते हैं। MSDN-Windows Forms Invoke

इस तरह

:

public class Class1 
{ 
    private Form myForm; 

    public Class1() 
    { 
     myForm = new Form(); 
    } 

    public void DoSomeWork() 
    { 
     // =================================================== 
     // Do Some Work... 
     // =================================================== 

     myForm.Invoke(new MethodInvoker(this.Hide)); 
    } 

    public void Hide() 
    { 
     myForm.Hide(); 
    } 

    public void Backup() 
    { 
     myForm.ShowDialog(); 

     Thread load = new Thread(new ThreadStart(DoSomeWork)); 
     load.Start(); 
    } 
} 
2

आप इस के लिए कुछ तरीके से कर सकता ...

1 - के रूप में BendEg सुझाव आप करते हैं और आह्वान आप frmClose एक बार आप तैयार हैं सकता है

कुछ इस तरह;

Invoke(new Action(Close)); 

या

Invoke(new Action(() => frmMain.Close())); 

2 - या आप बस एक पृष्ठभूमि कार्यकर्ता इस्तेमाल कर सकते हैं;

इस प्रदर्शन करने के लिए अपने फार्म के लिए एक BackgroundWorker जोड़ने के लिए, और प्रयोग प्रदान की घटनाओं होगा सबसे आसान तरीका है;

public Form1() 
{ 
    InitializeComponent(); 
    backgroundWorker1.RunWorkerAsync(); 

    MessageBox.Show(@"Please wait while the database is being backed up", @"This might take several days."); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Debug.WriteLine("Running"); //Execute a task 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    Debug.WriteLine("Ended"); //Dispose of any objects you'd like (close yor form etc.) 
} 

मुझे उम्मीद है कि इससे मदद मिलती है।

0

मुझे लगता है कि यह आपकी मदद करेंगे (अगर मैं आप ही समझ गए):

   Parallel.Invoke(() => somemethod(),() => 
       { 
        someothertaskmethod(); 
       }); 

मैं उदाहरण चल 2 कार्यों का प्रदर्शन करने के तरीके के रूप में रखा गया है।

आप उचित उपयोग करते हुए बयान using System.Threading.Tasks;

1

उपयोग करने के लिए nee मुझे लगता है कि यह आपके लिए काम कर सकते हैं।

void YourMethod() 
{ 
    WaitForm wf = new WaitForm(); 
    Invoke(new PleaseWaitDelegate(Launch),wf); 
    bool val = BoolMethodDoWork(); 
    Invoke(new PleaseWaitDelegate(Close), wf); 
       if(val) 
       { 
        MessageBox.Show("Success!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
        return; 
       } 
       MessageBox.Show("Damn!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
} 
delegate void PleaseWaitDelegate(Form form); 
     void Launch(Form form) 
     { 
      new System.Threading.Thread(()=> form. ShowDialog()).Start(); 
     } 

     void Close(Form form) 
     { 
      form.Close(); 
     } 
संबंधित मुद्दे