检测主UI是否正在关闭

时间:2014-08-20 08:38:47

标签: c# winforms

我目前正在开发一个类库。我找不到检测主UI是否正在关闭的方法。

有没有办法从类库项目中知道它?

我的目的是在主UI关闭时取消当前正在运行的所有线程。

6 个答案:

答案 0 :(得分:3)

您可以在Program.cs文件中使用ApplicationExit事件,前提是您有所有正在运行的线程的列表,您可以关闭。

Application.ApplicationExit += new EventHandler(Application_ApplicationExit);


static void Application_ApplicationExit(object sender, EventArgs e)
    {
        //do something
    }

其他选项是跟踪主表单的FormClosing事件。

答案 1 :(得分:2)

首先,在您的DLL中,引用 Syste.Windows.Forms 类库 然后,在DLL构造函数中,为Application Exit添加事件,如下所示:

public class MyDLLClass
{
    public MyDLLClass()
    {
        Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
    }

    void Application_ApplicationExit(object sender, EventArgs e)
    {
        //Your thread handling code...
    }
}

就是这样!

在我的窗体中测试:

  public Form1()
    {
        InitializeComponent();

        MyDLL_NameSpace.MyDLLClass ff = new MyDLL_NameSpace.MyDLLClass();
    }

调试(关闭应用程序): enter image description here

答案 2 :(得分:1)

主窗体有OnClose等可以处理的事件。只需订阅适当的活动即可。您甚至可以在某些情况下使用覆盖,这些覆盖允许您在默认值之前或之外执行单独操作。因此,通常会覆盖OnDispose。

答案 3 :(得分:1)

通过将Form传递给构造函数,可以在类库中处理FormClosing事件。您可以在线程管理类中注册一个私有事件处理程序,并在调用它时取消事件处理程序中的线程。

在这个例子中,我使用了CancellationTokenSource来取消对类中运行的任何线程的攻击。<​​/ p>

public class ThreadManager()
{
    private CancellationTokenSource cts = new CancellationTokenSource();

    public ThreadManager(Form form)
    {
        form.FormClosing += OnFormClosing;
    }

    private void OnFormClosing(object sender, FormClosingEventArgs e)
    {
        cts.Cancel();
    }
}

如果在表单中构造线程管理器,可以这样注册:

public partial class MainForm : Form
{
    private ThreadManager threadMgr;

    public MainForm()
    {
        threadMgr = new ThreadManager(this);
    }
}

答案 4 :(得分:1)

您可以制作所有帖子background。后台线程不会保持主应用程序运行,并在应用程序退出时自动关闭:

  

后台线程与前台线程相同,但有一个例外:后台线程不会使托管执行环境保持运行。一旦所有前台线程在托管进程中停止(其中.exe文件是托管程序集),系统将停止所有后台线程并关闭。

您可以为设置Thread.IsBackground属性的线程更改它。

正如magos在下面的评论中正确指出的,这个解决方案的缺点是你的线程没有任何机会进行一些清理。内存和句柄不应该是一个问题,因为操作系统会释放它们,但是从长期来看,像非交换事务这样的事情可能会导致问题。


另一个设计级别的想法是为您的图书馆配备Closing功能,让主用户界面从ApplicationExitFormClosing个事件中调用它。如果可能,那么这看起来就像是最干净的解决方案。

答案 5 :(得分:1)

您的类库根本不应该进入您的UI应用程序。首先它是一个类库的原因,对吗?

在库ShutDown方法中提供相关的类,让您的UI应用程序监听自己的关闭事件。在事件回调中,您告诉类库的工作人员等关闭。