我目前正在开发一个类库。我找不到检测主UI是否正在关闭的方法。
有没有办法从类库项目中知道它?
我的目的是在主UI关闭时取消当前正在运行的所有线程。
答案 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();
}
调试(关闭应用程序):
答案 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
功能,让主用户界面从ApplicationExit
或FormClosing
个事件中调用它。如果可能,那么这看起来就像是最干净的解决方案。
答案 5 :(得分:1)
您的类库根本不应该进入您的UI应用程序。首先它是一个类库的原因,对吗?
在库ShutDown方法中提供相关的类,让您的UI应用程序监听自己的关闭事件。在事件回调中,您告诉类库的工作人员等关闭。