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 будет корректно выходить из цикла сообщений.