c#关闭一个使用Application.Run()的线程

本文关键字:Application Run 线程 一个 | 更新日期: 2023-09-27 18:10:58

我正在尝试使用我可以访问代码的c# DLL,但我实际上不能更改代码并构建自定义版本。调用代码是一个c# WinForms项目,c# DLL也使用WinForms来处理Windows系统事件。问题是,DLL使用Application.Run()内部使用一个后台线程,并有内置的方法来杀死或停止该线程。下面是代码片段:

public class DllClass
{
    private Thread uithread = null;
    private bool uithreadstarted = false;
    public DllClass()
    {
        uithread = new Thread(new ThreadStart(RunDll));
        uithread.IsBackground = true;
        uithread.SetApartmentState(ApartmentState.STA);
        uithread.Start();
        do
        {
            Thread.Sleep(100);
        } while (uithreadstarted == false);
    }
    private void RunDll()
    {
        //other init stuff here
        uithreadstarted = true;
        Application.Run();
    }
}

显然,我希望通过使用Application.Exit()来杀死它,但这也退出了我自己的WinForms项目,这不是我想要发生的。如果我只是关闭我的应用程序而不调用application . exit (), DLL将继续在后台运行。我希望能够实例化DllClass对象,使用它,然后在完成后关闭它。我想出了一个方法来获得线程的线程对象,它正在运行,但调用Thread. abort()实际上并没有杀死线程。有没有办法从DLL外部强制中止Application.Run()调用?

c#关闭一个使用Application.Run()的线程

如果你能找到一个由DLL后台线程创建的窗口句柄(如表单或隐藏的应用程序窗口),你可以向该句柄发布一个WM_QUIT消息,这应该会导致DLL干净地退出消息循环

你将需要得到一个实例的形式是运行在另一个线程,然后调用形式。BeginInvoke并从那里调用Application。退出

应用程序呢?ExitThread