`
minh456
  • 浏览: 64192 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

C# 中关闭当前线程的四种方式

阅读更多
.net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法
.net类库已经帮助我们实现了窗口的关闭,如果此窗口是系统的主窗口,关闭此窗口即应该退出了整个应用程序。
但事实上有时候并不是这样的,关闭窗口,只是停止了当前窗口的消息循环。
系统主窗口,实质上是Main函数中开始消息循环的窗口,这个消息循环结束后,Main函数就基本上完成了历史使命,整个应用程序自然就结束了。
Application.Exit()方法是终止所有线程上的消息循环,一般情况下,无论在什么地方调用此方法,程序就能退出。
但是如果你在程序中加入了某些耗时甚至是死循环的线程,那么即使是消息循环终止,程序也依然不会结束。
比较温和比较合适的做法是结束消息循环之前,终止所有自己新建的线程。
有时候我们连自己也搞不清楚到底是那些顽固的线程在执行,就需要用点暴力的手段了。.net为我们提供了Environment.Exit(0)方法,调用此方法,应用程序即强制退出。
当你打开一个子窗体,进行某项操作时,如果字窗体中有循环操作时。如果运行中我关闭子窗体,发现窗体虽然关闭了,但子窗体中的循环程序却没有退出,一直在 执行,并占用着系统资源,直到循环结束,才真正的释放资源。尽管你在字窗体的Closed事件中写了如下代码:

private void frmFileDisposal_Closed(object sender, System.EventArgs e)
{
this.Dispose();
this.Close();
}
从查MSDN和从网上查资料可以知道,Dispose()方法,虽然能释放当前窗体的资源,却不能强制结束循环,
要想强制突出当前程序要用:System.Environment.Exit(int exitcode)方法;该方法:终止当前进程并为基础操作系统提供指定的退出代码。

如下则问题解决:
private void frmFileDisposal_Closed(object sender, System.EventArgs e)
{
System.Environment.Exit(System.Environment.ExitCode);
this.Dispose();
this.Close();
}

或者把它放到事件里:
while (MessageBox.Show("退出当前窗体?", "", MessageBoxButtons.YesNo) == DialogResult.No)
{
for(int j=1; j<=i; j++)
{
listBox1.Items.Add(j);
}
}
System.Environment.Exit(System.Environment.ExitCode);

还有一种方法: System.Threading.Thread.CurrentThread.Abort();
或者 Process.GetCurrentProcess().Kill()
或者 Application.ExitThread();
或者 Application.ExitThread()

不过以上方法,都是强制直接退出了整个程序,不只是关闭子窗体。可能还会引发某些问题,
我感觉最好方法的就是,在子窗体的Closing事件中,写循环退出条件,这样就可以避免某些未知的错误,而且可以只关闭子窗体,并释放子窗体占用的资源

Application.Exit(); 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口
Application.Exit 是一种强行退出方式,就像 Win32 的 PostQuitMessage()。它意味着放弃所有消息泵,展开调用堆栈,并将执行返回给系统。
在 Windows(Win32 或 .NET)中关闭应用程序的正确方式是关闭它的主应用程序窗口(例如 Form.Close)。主消息泵结束后依然存在的任何窗口都需要手动关闭。在应用程序退出之前通过调用 Form.Close 或 Form.Dispose 来关闭窗口是清除窗口的良好做法,但这需要您有意识地去做。我们需要记住,.NET Framework 的 OnClosing() 是 Win32 的托管版本的 WM_CLOSE,而非 WM_DESTROY。
另外,如果您使用 form.Close(),通过处理 OnClosing 或 OnClosed 事件,就可以让您的应用程序清理内容、关闭文件等。如果您通过 Application.Exit 强行退出应用程序,就无法调用这些事件。
Application.Exit(); 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口
Application.Exit 是一种强行退出方式,就像 Win32 的 PostQuitMessage()。它意味着放弃所有消息泵,展开调用堆栈,并将执行返回给系统
Environment.Exit(0)方法,调用此方法,应用程序即强制退出
I have a windows form application. It is accessing a backend SQL server. The
data access are wrapped in modules. If the data access failed, I wanted to
display a popup error message and then exit the application. I tried to use
Application.Exit(), Application.ExitThread, and Environment.Exit(). They all
have kind weird problem.
1. Applicaiton.Exit() This method is called within an exception block, after
displaying a message box to the user. It seems it is not doing anything. The
rest of code will be executed in order like nothing happened.

2. Application.ExitThread() The same as Application.Exit()

3. Thread.CurrentThread.Abort() This method will cause ThreadAbort
Exception, so I have to handle this exception from layer to layer.

4. Environment.Exit() In exception catch block, I display the message box,
and then call this method. This caused the application to exit, but the
message box just flashed and disappeared

分享到:
评论

相关推荐

    c# 多线程任务中结束全部线程

    在C#中,多线程是程序设计中的一个重要概念,它允许程序同时执行多个操作,从而提高程序的效率和响应性。然而,在某些情况下,我们可能需要终止正在运行的所有线程,这通常发生在应用程序需要关闭或者某个关键错误...

    C#文件多线程复制代码

    在C#编程中,多线程技术是一种提升程序性能的有效手段,特别是在处理大量I/O操作如文件复制时。本文将详细讲解如何利用C#实现文件的多线程复制,包括线程池的使用、线程数量限制以及FileStream类的读写功能。 首先...

    C#多线程之如何弹出一个模式窗口来显示进度条

    在C#编程中,多线程技术是一种常见且强大的工具,用于提高应用程序的性能和响应性。当一个耗时的任务需要执行时,如文件读写、网络请求或复杂的计算,多线程可以使用户界面(UI)保持流畅,不被长时间阻塞。在本教程...

    c#跨线程跨类调用窗体控件

    由于这个操作是在非UI线程中进行的,`InvokeRequired`检查确保了`AddItemToListBox`方法在正确的线程上执行。 标签“调用窗体控件”和“c#跨线程”提醒我们注意线程安全和UI更新的问题,而“跨类”则强调了对象间的...

    c# 实现多窗口间线程控制

    在UI线程中,`await`表达式会释放控制权,直到异步操作完成,从而保持UI的响应性。 总结来说,实现“C# 实现多窗口间线程控制”涉及的知识点包括线程的创建和管理、UI线程安全、窗口通信、事件驱动编程、异步编程等...

    WinForm C#多线程等待窗体

    3. 在新线程中,实例化`WaitForm`并调用`ShowDialog`,这将阻塞当前线程(新线程)。 4. 在新线程中执行耗时任务。 5. 任务完成后,关闭`WaitForm`,这将自动结束新线程并释放所有资源。 6. 主线程将解阻塞,继续...

    C#-正确结束线程-通过给定信号结束线程.rar

    在线程中,可以使用`WaitOne()`来阻塞线程,直到接收到结束信号,或者使用`WaitAny()`来等待任意一个信号。 5. **异步编程与Task:** 当使用`Task`进行异步操作时,可以使用`TaskCancelationToken`与`...

    C# Winform线程创建子窗体

    此外,`BackgroundWorker`组件也是一个常见的选择,它提供了一种更易用的方式来处理后台任务,包括报告进度和取消操作。 总的来说,掌握C# Winform中的线程技术和跨线程控件操作是提升应用性能和用户体验的关键。...

    C#多线程扫描器

    在C#中,多线程是通过System.Threading命名空间提供的类来实现的。"C#多线程扫描器"是一个利用C#语言特性实现的高效扫描工具,可能用于端口扫描或网络监控等场景。下面我们将详细讨论多线程的概念、C#中的多线程实现...

    C# 线程A访问非线程A创建的控件 、 线程内创建窗体置顶显示ShowDialog

    `Form.ShowDialog`方法会在当前线程中打开一个模态对话框,阻止用户与父窗口或其他窗体交互,直到该对话框关闭。为了在非主线程中显示窗体并使其置顶,你需要确保在正确的线程上执行`ShowDialog`,因为窗体必须在其...

    C#多线程操作

    - `IsAlive`:获取一个值,该值指示当前线程是否正在执行。 - `Priority`:获取或设置线程的优先级。 - `IsBackground`:获取或设置一个值,该值指示线程是否为后台线程。后台线程在最后一个前台线程退出时将自动...

    C#线程及定时器的功能实现

    界面的设计应确保用户能够清晰地了解当前线程和定时器的状态。 总结来说,C#线程和定时器的实现涉及对多线程编程和事件驱动编程的理解。在实际应用中,合理地使用线程和定时器可以提高程序的响应性和效率,而良好的...

    c# winform 关闭窗体时同时结束线程实现思路

    在这个例子中,`stopEvent`会在窗体关闭时被设置为`Set`状态,线程中的循环就会立即退出,然后线程自然结束。 除了上述方法,还可以考虑使用`ThreadPool`,它会自动管理线程生命周期,或者使用`Task`和`async/await...

    C#停止线程的方法

    在C#编程中,线程是多任务并行处理的基础,允许程序同时执行多个独立的代码段。然而,有时候我们需要控制或停止这些线程以达到更好的资源管理和程序协调。本文将详细讨论如何在C#中正确地停止线程。 首先,C#并没有...

    c#编程跨线程调用窗体的方法

    这里的关键在于`Invoke`方法能够在当前窗体的线程中安全地执行委托所指向的方法。 4. **更新UI**:`Threading`方法被调用后,会更新`textBox1`控件的文本。 #### 结论 通过上述方法,我们可以安全地从子线程中调用...

    dll远线程注入c#的实现方法

    远线程注入就是将代码注入到目标进程的一个非当前执行线程中。 实现DLL远线程注入通常涉及以下步骤: 1. **创建DLL**:编写包含要注入的代码的DLL项目。这个代码通常是一个导出函数,该函数在被注入的目标进程中...

    C#关闭指定名字进程的方法

    5. **等待进程完全退出**:为了确保进程真正关闭,可以使用`Process.WaitForExit()`方法阻塞当前线程,直到被关闭的进程完全退出。这样可以避免因进程未完全关闭而导致的问题。 以下是一个完整的示例代码,展示了...

    C#中Socket多线程编程实例.pdf

    在本实例中,我们将探讨如何在C#中实现基于Socket的多线程编程。通过实例,我们将展示如何创建一个TCP客户端,利用多线程技术实现网络通信,以及如何在Windows窗体应用程序中处理用户界面(UI)的更新。 首先,我们...

    C# Winform在MDI中打开一个子窗体关闭上一个子窗体

    在C# Winform编程中,MDI(Multiple Document Interface)多文档界面是一种常见的窗口布局方式,它允许在一个主窗口中嵌套多个子窗口,每个子窗口可以独立操作,但共享同一菜单栏、工具栏等资源。本文将深入探讨如何...

    C#关闭应用程序进程

    ### C#关闭应用程序进程 在C#编程语言中,关闭应用程序进程是一项常见但需要谨慎处理的任务。本篇文章将深入探讨如何使用C#来安全地关闭应用程序进程,包括但不限于使用`Process`类、`Application.Exit()`方法以及...

Global site tag (gtag.js) - Google Analytics