Solved

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

Posted on 2007-03-28
3
2,022 Views
Last Modified: 2013-12-17
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
Comment
Question by:yami_rider
  • 2
3 Comments
 
LVL 11

Expert Comment

by:Babycorn-Starfish
Comment Utility
Hi,

what owns the instance of FormA?
0
 

Author Comment

by:yami_rider
Comment Utility
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
 
LVL 11

Accepted Solution

by:
Babycorn-Starfish earned 250 total points
Comment Utility
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

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Recently while returning home from work my wife (another .NET developer) was murmuring something. On further poking she said that she has been assigned a task where she has to serialize and deserialize objects and she is afraid of serialization. Wha…
A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now