поток не работает для выхода из формы2 - PullRequest
0 голосов
/ 13 июля 2011

поток не работает для выхода из формы2

private void button1_Click(object sender, EventArgs e)
{
    ThreadStart myThreadDelegate = new ThreadStart(RunExitForm2);
    Form2 f2 = new Form2();
    Thread MyThread = new Thread(myThreadDelegate);
    f2.ShowDialog();
    MyThread.Start();

}
private void RunExitForm2()
{
    Form2 f2 = new Form2();
    f2.Close();
}

Ответы [ 4 ]

3 голосов
/ 13 июля 2011

Редактировать:

Возможно, вам лучше поместить Timer в форму Form2, которая закроет окно через 2 секунды после его открытия. Значок на панели инструментов выглядит как секундомер. В окне свойств установите Interval=2000 и Enabled=True, затем подпишитесь на событие Tick и скажите this.Close();

void timer1_Tick(object sender, EventArgs ea)
{
   this.Close ();
}

Оригинальный ответ:

Начнем с того, что вы, как правило, не можете смешивать вещи system.windows.forms с рабочими потоками. Вам необходимо использовать пользовательский интерфейс потока сообщений.

Другая проблема заключается в том, что поток не запускается, пока вы не закроете первое окно (из-за .ShowDialog(). Рабочий поток сообщает форму (но никогда не показывает), а затем закрывает ее (но она не открыта) ), так что оно никогда не появится.

0 голосов
/ 13 июля 2011

Никогда не следует вызывать метод или свойство элемента управления пользовательского интерфейса из второго потока.

Взгляните на Как сделать потокобезопасные вызовы элементов управления Windows Forms

0 голосов
/ 13 июля 2011

глядя на код, вы создаете два экземпляра Form2, при попытке закрыть вы создаете новый экземпляр.

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

Дайте мне знать, что именно является вашим требованием. Как упоминалось ранее в этом посте, разрешать рабочим потокам доступ к элементам пользовательского интерфейса не очень хорошая идея

Это то, что я бы сделал

private void button1_Click (отправитель объекта, EventArgs e) { ThreadStart myThreadDelegate = новый ThreadStart (RunExitForm2);

        Thread MyThread = new Thread(myThreadDelegate);
        MyThread.Start();
        f2.ShowDialog(Application.OpenForms[0]);



    }

    private void RunExitForm2()
    {
        Thread.Sleep(10000);

       test t = new test(f2.CloseForm2);


        if (InvokeRequired)
        {
            BeginInvoke( t);
            return;
        }

    }

Здесь test является делегатом метода Closeform2, определенного в Form2, в котором я просто закрываю форму

0 голосов
/ 13 июля 2011

Это то, что вы имеете в виду?

private void button1_Click(object sender, EventArgs e)
    {
        Form2 frmTest = new Form2();

        System.Threading.ThreadPool.QueueUserWorkItem(f =>
        {
            // easy to see the effect...
            System.Threading.Thread.Sleep(1000);

            Form2 me = f as Form2;
            this.BeginInvoke(new Action(() => {
                me.Close();
            }));

        }, frmTest);

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