Threads are still running in C# - c#

I have 2 forms: signin and control_panel. After signin done I'm hiding this form by this.Hide() function and same time I am making new object of control_panel form and showing it by newobj.Show();. But when I am closing directly control_panel form, I am seeing first form thread are still running. I am closing it by stop_debugging button. How will I close every threads or whole program exit simultaneously.

The thread for your first form is still running because you're only calling this.Hide. All that does is hide the form; it doesn't close it. Instead, you need to use this.Close, which will close your original form.
If you want to make sure that your entire application exits, and in the process close any forms that may still be open, you can use the Application.Exit method anywhere in your form's code.
EDIT: To expand on my last comment, you might want something like this in your Program.cs file:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
SignInForm frmSignIn = new SignInForm();
if (frmSignIn.ShowDialog() == DialogResult.Yes)
{
//If the sign-in completed successfully, show the main form
//(otherwise, the application will quit because the sign-in failed)
Application.Run(new ControlPanelForm());
}
}
}

Create a FormClosed event in control_panel form property window of control_panel and write the following line as
private void control_panel_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}

Related

Windows forms Form closed event not working with opening a new form

I have some code meant to open a new windows form when one is closed, and yet I get nothing, no error.
I've tried a few different methods for opening a new form on a Form.FormClosed event.
This is the code I have right now:
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Form1 myForm = new Form1();
myForm.Show();
}
But yet I get no error, nothing.
I'm expecting for a new windows form to be opened when I close another one.
Any help would be appreciated, thanks!
The problem is that as soon as the first Form1 instance closes, your application shuts down and exits because the application message loop is defined with the initial Form instance, and it is just waiting for events on that form until it closes. On closing, the application will exit, opening a new form doesn't stop this process.
You need to adjust the Main() method in Program.cs to look something like this:
[STAThread]
static void Main()
{
// ... Application configuration as required here
new Form1().Show(); // The first form instance is now no longer bound to the Application message loop. Start it before we begin the run loop
Application.Run(); // Don't pass in Form1
}
Your original code should now work. I might add however, this is not a great user experience. Carefully consider what you're trying to achieve, and perhaps consider alternatives - do you just need a "reset form" button? Or is the primary goal to prevent a user from closing the application? If the latter, you can remove the Close icon altogether.
Perhaps something simple to get your going forward.
private Form1 myForm = new Form1(); //Declare the form as a private member variable
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
e.Cancel = true; //Cancel the closing so this object stays alive
this.Visible = false; //Hide this form
myForm.Show(); //Show the next form
}
Please note #pcdevs comment. You'll need a way to indicate the form is being closed/application quiting vs progressing to the next step/form. You might want to look at some CodeProject articles about "C# Winform Wizards", those sequential dialog prompt apps...

Windows form application not closing

I am making a Windows form app in c# and the process is never killed after I close the main form. The process sits in the background, taking up memory. I have tried many methods, such as Application.exit and Environment.exit, none of which have worked.
I have tried:
private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
{
Environment.Exit(0);
}
And
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
Environment.Exit(0);
}
}
I have tried both methods using both Application.Exit and Environment.Exit
I just want a solution that kills the process upon closing the main form
EDIT:
Upon closer inspection, this error only occurs when a button is pressed that switches to my project's second form using:
Form2 f = new Form2();
f.Show();
this.Hide();
I have used:
Environment.Exit(0);
Application.Exit();
and it was working for me on a project of mine.
If it isn't already, you need to mark your main method with [STAThread] attribute (see https://stackoverflow.com/a/1361048/1497128), like so --
[STAThread]
private static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
If it is, then make sure that...
... all foreground threads are being terminated before the form closes
... if you subscribe to FormClosing event then ensure you are not setting Cancel = true
Neither of your solutions are necessary, WinForm applications terminate the process when the main form is closed (assuming nothing else is blocking, such as another foreground thread). You can test this by creating a new WinForm project in Visual Studio, running it and closing the form.
Unless you are using specific logic to control when the application should exit, you definitely shouldn't need Environment.Exit(0) (mainly used for console apps) nor Application.Exit() (used with WinForm apps). Closing the form should do it, which can be done programmatically by calling form.Close().
when using a button click to open a new form use USING
using (Form1 frm = new Form())
{
frm.ShowDialog();
}

Open new windows form window, closes immediately

I am trying to open a new windows form, however it seem to close immediately every time.
it works if i use ShowDialog() instead of Show(), but that is not my intention.
class Forms
{
Main mainForm;
Thread mainThread;
public Forms()
{
}
private void ThreadProc()
{
try
{
mainForm = new Main();
mainForm.Show();
}
catch { }
}
public void startMain()
{
mainThread = new Thread(new ThreadStart(ThreadProc));
mainThread.SetApartmentState(ApartmentState.STA);
mainThread.Start();
}
}
The problem is your mainThread does not run any message loop (that is responsible to react to all the GUI-related messages like resizing, button clicks, etc...), and so after calling mainForm.Show() the thread finishes.
In fact winforms applications usually start like this:
Application.Run(new MainForm());
where, as you can see in the MSDN documentation, Application.Run starts a standard message loop in the current thread and shows the form.
If you use ShowDialog() it works because modal forms run their own message loop internally.
I don't know what you are trying to accomplish but ShowDialog might be the easiest solution; in case you don't like it just replace your mainForm.Show with Application.Run(mainForm) and it should work.
You would need to use Application.Run to start the application message loop, otherwise the program would act like a console app and close once its code has finished executing.
Add using System.Windows.Forms; to the top of the class.
Then change mainForm.Show(); to Application.Run(mainForm); inside ThreadProc.
You should use:
Application.Run(new MainForm());
Begins running a standard application message loop on the current
thread, and makes the specified form visible.

C# application exits when I dispose

Basically I have a Login window which should close once the user logs in and show another window, for now I've just hid it(Form.Hide()) however I do not wish to take unnescesary system resources and I don't need the login window after I already logged in.
this is the code snippet where I perform the operation:
MainWindow w = new MainWindow();
TimeRegisterApI.Instance.Windows.Add(w.Text,w);
TimeRegisterApI.Instance.Windows[w.Text].Show();
this.Dispose();
Windows is a dictionary that stores references of forms with their title as the key.
TimeRegisterApi is a singleton.
Basically what happens is that my application exits after I login instead of just disposing the login window, when I want it to dispose(close and go to the garbage collector.)
I know that having the title as key might cause duplicate key entries but in my current design it's no problem.
You have to make your window form login as a modal form which parent is your mainform
it will allow you to wait an answer (like a savedialog) and return to your main window form)
this is your main form so you exist
ok I fixed the problem, basically what happens is that when the window that is run from program.cs at application.run(window) gets disposed it closes the program because it's the main window, I think it would be possible to do an e.cancel on the dispose event of this window, however I solved the problem by running the window in a new application.run like this:
from program.cs, relevant lines
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LoginWindow());
start();
}
public static void start()
{
if (TimeRegisterApI.isLoggedIn())
{
MainWindow w = new MainWindow();
Application.Run(w);
}
}

Closing Form In C# [duplicate]

This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
C# Working with mutliple Forms
I have two forms in C#. I want to close one form and show other. The code is as follows:
AMBR A = new AMBR();
this.Close();
A.Show();
The current form is my main form. It shows my second form, but than closes both and my program stops. I know another standard approach is to hide the form, but my main form only has a logo and loading bar. It don't need any interaction with the user. When I hide it, after the second form is closed the program remain open (as seen in the task manager) and continues to occupy resources. I want the main form to close and second form to remain open.
Open your "Program.cs". Modify the code to be as follows, where SplashFrm is the current Form that is being created in your Application.Run call
static class Program
{
private static EventHandler idleTemp;
private static SplashFrm splash;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
splash = new SplashFrm();
splash.Show();
idleTemp = new EventHandler(Application_Idle);
Application.Idle += idleTemp;
Application.Run(new AMBR());
}
static void Application_Idle(object sender, EventArgs e)
{
splash.Close();
Application.Idle -= idleTemp;
idleTemp = null;
splash = null;
}
}
Then, after AMBR is successfully loaded, call Application.RaiseIdle(null); and your splash will be closed and cleaned up.
No you cannot close the main form and maintain the second form opened. But you can hide it.
this.Hide();
EDIT:
Another solution could be use the second form as the main form and make it invisible while the second form (splash form) is opened.
So:
this.Visible = false;
//Show the second form
There is an example on the Application.Run MSDN page that explains how you can inherit from ApplicationContext to make your program end only when the last form has been closed, and not just once the main form is closed.
Have you tried this.Hide(); instead of this.Close();?
The problem probably happens because your main method is creating the first form and waits for it to close. when it closes the main proceeds and reaches the end which result in your application shutdown.
either make the main method create the second form or dont close the first one and just hide it + hide the taskbar icon.
It sounds like you have the wrong main form. You should change the other form that you are opening to be your main form, and the form that is currently your main form should be opened by the other form. When your current main form is closed, have it Show your new main form. Have your new main form hidden when the program starts.

Categories