Закрыть форму из потока - PullRequest
       2

Закрыть форму из потока

1 голос
/ 27 февраля 2012

У меня есть поток, который начинается в моей основной форме

    private void changePasswordbutton_Click_1(object sender, EventArgs e)
    {
        waitForm.Show();
        Thread thread = new Thread(ProcessInkPresenter);
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();
        waitForm.Hide();
        waitForm.Dispose();
    }

Я хочу закрыть waitForm внутри метода ProcessInkPresenter (который выполняется в потоке) вместо ожидания завершения потока.

Как мне это сделать?

Спасибо

Сигнатуры методов

private void ProcessInkPresenter()

Определено в заголовке класса

Wait waitForm;

1 Ответ

2 голосов
/ 27 февраля 2012

Ваш оригинальный код не имеет смысла. Он показывает форму, затем запускает поток, а затем ожидает завершения этого потока. Если вы хотите, чтобы форма запускалась в собственном потоке пользовательского интерфейса, ProcessInkPresenter запустите в том же потоке пользовательского интерфейса (что следует делать, если он взаимодействует с пользовательским интерфейсом) и закройте форму и удалите ее после завершения ProcessInkPresenter, попробуйте это:

private void changePasswordbutton_Click_1(object sender, EventArgs e)
{
    Thread thread = new Thread(state => {
            using (var waitForm = new WaitForm()) {
                waitForm.Activated += (s, e) => {
                    ProcessInkPresenter();
                    waitForm.Hide();
                }
                Application.Run(waitForm);
            }
        }
    );
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

Если рабочий поток не должен взаимодействовать с графическим интерфейсом, то вам нужно что-то вроде следующего. Обратите внимание, что я использую Invoke, чтобы убедиться, что взаимодействие с пользовательским интерфейсом выполняется в потоке пользовательского интерфейса . Здесь нет необходимости проверять InvokeRequired, поскольку я уже точно знаю, что я нахожусь в фоновом потоке.

Если вы хотите сохранить тот же экземпляр waitForm:

private void changePasswordbutton_Click_1(object sender, EventArgs e)
{
    Thread thread = new Thread(state => {
            try {
                ProcessInkPresenter();

                // If ProcessInkPresenter fails, this line will never execute
                waitForm.Invoke(new Action(()=>waitForm.Hide()));
            }
            catch (Exception ex) {
                // You probably want to do something with ex here,
                // rather than just swallowing it.
            }
        });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    waitForm.Show();
}

ПРИМЕЧАНИЕ: Не имеет смысла утилизировать ваш WaitForm, если у вас есть один его экземпляр (ваш Wait экземпляр). Либо создайте экземпляр каждый раз, когда вы его используете, либо никогда не удаляйте его и используйте вместо него .Hide().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...