C# завершение работы потока, который использует Application.Run()

Я пытаюсь использовать 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() для него фактически не уничтожает поток. Есть ли способ принудительно прервать вызов Application.Run() извне DLL?

3 ответа

Решение

Вам нужно будет получить экземпляр формы, работающей в другом потоке, затем вызвать form.BeginInvoke и оттуда вызвать Application.Exit

Если вы можете найти дескриптор окна, который был создан фоновым потоком DLL (например, форма или скрытое окно приложения), вы можете опубликовать сообщение WM_QUIT для этого дескриптора, и это должно привести к тому, что DLL будет корректно выходить из цикла сообщений.

Как насчет Application.ExitThread

Другие вопросы по тегам