从另一个线程和Form停止线程

时间:2013-09-07 06:06:08

标签: c# multithreading forms

在项目中使用C#中的表单时,我有我的主表单(mainForm)。这个表单,当单击button1时,它为第二个Form(actionForm)创建一个新线程。这个,与main相同,当我点击button1时,它为thid Form(registerForm)创建一个新线程。第三个表格,当我关闭它时,它必须重新创建第二个表格。

问题是,线程继续运行。表格已经关闭。但是当我点击第三种形式的“X”时,它会循环,创建新的actionsForms。

如何在创建新线程时停止线程? 有没有更好的方法来使用表单?

代码:

namespace Lector
{
    public partial class register : Form
    {
        public register()
        {
            InitializeComponent();
        }

    //New thread for Form2
    public static void ThreadProc()
    {
        //New Form
        Application.Run(new Form2());

    }

    //Close Form
    private void Registro_FormClosing(Object sender, FormClosingEventArgs e) 
    {
        regresoForma();
    }

    private void regresoForma()
    {
        //New thread
        System.Threading.Thread nuevoRegistro2 = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));

        //Start thread
        nuevoRegistro2.Start();

        //Close this form
        this.Close();
    }


    private void button1_Click(object sender, EventArgs e)
    {

    }
}
}

2 个答案:

答案 0 :(得分:1)

我建议您使用它,而根本不需要多线程:

private void regresoForma()
{
    //Hide this form
    this.Visible=false;

    //Start Form2 but as a dialog 
    //i.e. this thread will be blocked til Form2 instance closed
    (new Form2()).ShowDialog();

    //Reshow this form
    this.Visible=true;
}

答案 1 :(得分:0)

除非你需要让每个表单都将自己建立为一个全新的进程,否则我建议使用BackgroundWorker来显示新表单,如果你需要它们都是异步的。如果您使用的是WinForms。如果您使用的是WPF,则需要使用Dispatcher来创建新表单。

这实际上取决于表单的流程。

我个人尽量避免创建新线程,除非它绝对是百分之百必需的,并且我使用上述方法之一来做到这一点,除非我打电话给一个全新的应用程序。