C#关闭使用Application.Run()的线程

时间:2013-04-25 17:01:54

标签: c# .net multithreading winforms apartment-state

我正在尝试使用可以访问代码的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对象,但是在它上面调用Thread.Abort()实际上并没有杀死线程。有没有办法强制中止DLL外部的Application.Run()调用?

3 个答案:

答案 0 :(得分:1)

如果您可以找到由DLL后台线程创建的窗口句柄(例如窗体或隐藏的应用程序窗口),您可以将WM_QUIT消息发布到该句柄,这应该导致DLL干净地退出消息循环

答案 1 :(得分:0)

您需要获取在另一个线程中运行的表单实例,然后调用form.BeginInvoke并从那里调用Application.Exit

答案 2 :(得分:0)

Application.ExitThread

怎么样?