Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2148
  • Last Modified:

How to close application form from another Thread in C# .NET?

I have two forms, I am running some worker events on a thread in form A, when that work is done I want to close Form A and show Form B.  

If I simply use this.hide() I receive a cross thread exception which makes sense because I am not accessing it from the same thread.  Is this even possible?

private void CreateWorkerThread()
        {
            //Instance a ThreadStart object and intance it with the SnapShot class CollectData method.
            ThreadStart _threadStartA = new ThreadStart(DoWork);
            //Initialize a Thread object and set to null;
            Thread _threadA = null;


            try
            {
                //Instance Thread object with ThreadStart object.
                _threadA = new Thread(_threadStartA);
                //Name the Thread
                _threadA.Name = "Phase1";
                //Spawn the Thread
                _threadA.Start();
            }
            catch (Exception exp)
            {
                MessageBox.Show("Image Apply error: " + exp.Message);
            }
        }
        private void DoWork()
        {
            Test.com.Recovery.Recovery oRecovery = new Test.com.Recovery.Recovery();

            //Hook command line events
            oRecovery.OnCmdStarted += new Test.com.Recovery.RecoverCommandStarted(oRecovery_OnCmdStarted);
            oRecovery.OnCmdExited += new Test.com.Recovery.RecoverCommandExited(oRecovery_OnCmdExited);
            oRecovery.OnCmdOutputLine += new Test.com.Recovery.RecoveryCommandOutputLine(oRecovery_OnCmdOutputLine);

            //Hook image events
            oRecovery.OnStarted += new Test.com.Recovery.RecoverStartedEventHandler(oRecovery_OnStarted);
            oRecovery.OnComplete += new Test.com.Recovery.RecoverCompleteEventHandler(oRecovery_OnComplete);
            oRecovery.OnProgress += new Test.com.Recovery.RecoverProgressEventHandler(oRecovery_OnProgress);
            oRecovery.OnProcess += new Test.com.Recovery.RecoverProcessEventHandler(oRecovery_OnProcess);
            oRecovery.OnError += new Test.com.Recovery.RecoverErrorEventHandler(oRecovery_OnError);

           
            //First we need to get a DiskPart object
            if (oRecovery.ConfigureDisk(PopulateDiskPart(), true))
                if (oRecovery.RecoverImage(PopulateImage(ImageType.Debug)))//Recover 1st image first
                    if (oRecovery.RecoverImage(PopulateImage(ImageType.Debug)))//Recover 2nd image last
                    {
                                         this.Hide() <--- BAD wont work cross thread exception.
                        ***** DONE CLOSE THIS FORM AND OPEN A NEW FORM
                    }
        }
0
yami_rider
Asked:
yami_rider
  • 2
1 Solution
 
Babycorn-StarfishCommented:
Hi,

what owns the instance of FormA?
0
 
yami_riderAuthor Commented:
Maybe I should go into more detail about this.  Actually I am creating an application with several forms.

1. 3 Forms
a. First form is a end user license agreement with two buttons (agree and cancel)
b. Second form is will be displayed to the user showing the recovery process.  This has a progress bar.
c. Last form is simply a form that tells the user the recovery is complete or not complete.

If you can think of a setup application where the user is brought through multiple forms that is what I am trying to achieve.

When the EULA is displayed and the user clicks on agree I want the EULA form to disappear and the
Second form to appear and begin the recovery. When the recovery completes, I want the second form to close and the final form displaying that the recovery is complete or not complete to appear.

In the second form since I have controls on it and I am doing some background operations I spawn a thread and safely invoke the update on the controls (i.e. progress bar, etc.). This is where I think my problem is.
0
 
Babycorn-StarfishCommented:
Its probalby a hacky way of doing it but off the top of my head (though there are bound to be countless examples on this site somewhere and hopefully someone will step in....)

1) I'd make one form the main one (the one that gets shown after you accept the EULA)
In this form's Load event i'd create and show the form with the eula on.

2) on the EULA form i'd assign Ok and cancel repsectively to the Dialog Result property for eachg of the two relevant buttons for accepting or declining the EULA

3) when the user clicks either button close the form and retunr to the main form, then check the dialog result, e.g

        private void Form1_Load(object sender, EventArgs e)
        {
            Form2 eula = new Form2();
            eula.ShowDialog();
            if (eula.DialogResult == DialogResult.OK)
            {
                MessageBox.Show("Thanks for agreeing");
                //do your other stuff
             }
            else
                Close();
        }
Form here i'd do my business in a separate thread using a delegate and the forms Invoke function to update a progress bar and such like then hide the main form and show the final form upon completion of all my background tasks. When you close the third form the line after the one that showed it should be Close() to exit the app.
0

Featured Post

NFR key for Veeam Agent for Linux

Veeam is happy to provide a free NFR license for one year.  It allows for the non‑production use and valid for five workstations and two servers. Veeam Agent for Linux is a simple backup tool for your Linux installations, both on‑premises and in the public cloud.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now