Threadreference.isalive = true, но в окне потоков его местоположение [В режиме ожидания, ожидания или присоединения] - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть простая функция, которая запускает поток с модальной формой, а затем ожидает закрытия формы.

private static bool GetSomeText()
    {
        Thread threadx = new Thread(GetSomeTextx);

        threadx.SetApartmentState(ApartmentState.STA);
        threadx.Start();

        int i = 0;
        const int secs = 6000;
        while (threadx.IsAlive && i < secs)
        {
            Thread.Sleep(1000);
            i++;
        }

        if (i >= secs) //timeout
        {
            try
            {
                threadx.Abort();
            }
            catch { }

            MessageBox.Show("Timeout etc.");
            return false;
        }
        else
        {
            return CheckText(Constants.inputedtext);
        }
    }

    private static void GetSomeTextx()
    {
        WindowWrapper window = new WindowWrapper(Fun.GetForegroundWindow());
        FormGetSomeText epa = new FormGetSomeText { displaytext=Constants.displaytext};
        epa.ShowDialog(window);
        Constants.inputedtext= epa.inputedtext;
    }

Проблема в том, что после закрытия окна поток завершает работу с GetSomeTextx (), ноостается в подвешенном состоянии ... После этого, если я ставлю перерыв в "while (threadx.IsAlive && i переключиться на поток, появится сообщение «Нет доступного источника», а при нажатии «Показать разборку» будет показано «Разборка недоступна».

Этот код почти 1: 1.копия (в другом есть 2 текстовых поля вместо 1) другого случая, когда я должен получить значения таким образом, и он работает правильно ...

Что бы это могло быть?

Postdata: Попробовал уже добавить Thread.CurrentThread.Abort в конце GetSomeTextx без результата ...

1 Ответ

1 голос
/ 29 сентября 2011

Чтобы дождаться завершения потока, позвоните Join :

private static bool GetSomeText()
{
    Thread threadx = new Thread(GetSomeTextx);

    threadx.SetApartmentState(ApartmentState.STA);
    threadx.Start();

    // Wait for thread to exit
    threadx.Join();

Если вы хотите поддерживать создание отчетов при наличии тайм-аута, вызовите перегрузку Join, которая позволяет указать значение тайм-аута.

...