Prima domanda:
Voglio eseguire delle funzioni usando dei thread in modo che la form non vada in blocco

codice:
  private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            textBox2.Text = "";
            progressBar2.Step = 1;
            progressBar2.Value = 0;
            progressBar2.Minimum = 0;
            progressBar2.Maximum = 30;

            progressBar1.Step = 1;
            progressBar1.Value = 0;
            progressBar1.Minimum = 0;
            progressBar1.Maximum = 800;
            if (checkBox1.Checked)
            {
                ping();
            }
            if (checkBox2.Checked)
            {
                traceroot();
            }
            if (checkBox3.Checked)
            {
                int nodi = traceroot();
                progressBar1.Maximum = (nodi*N_test);
                thread = new Thread(new ThreadStart(pathping));
                thread.Start();
            }
            if (checkBox4.Checked)
            {
                thread = new Thread(new ThreadStart(download));
                thread.Start();
            }
            button1.Enabled = true;
        }
il fatto è che prima che quando viene seguita la funzione

codice:
thread = new Thread(new ThreadStart(pathping));
la form non vada avanti ad eseguire anche

codice:
thread = new Thread(new ThreadStart(download));
ho già provato con

codice:
thread.join();
posto dopo l'avvio ma il comando mi blocca la form. Come posso fare??

Seconda domanda:
Quando il pulsante X della form viene premuto ovviamente se un altro thread è aperto mi viene dato errore. Come faccio a chuidere prima i thread e poi la form??

Grazie a tutti.