Porównanie wydajności pracy jedno i wielowątkowej w C#

Program ma umożliwić ocenę efektywności pracy wielowątkowej w różnych warunkach w porównaniu z pracą realizowaną w wątku głównym.
Będą sortowane tablice liczb typu double i mierzony czas wykonania wszystkich sortowań.

Deklaracje wstępne
    DateTime t1; //czas rozpoczęcia 
    DateTime t2; //czas zakończenia
    
    int m = 10000;  // rozmiar sortowanych tablic (do zmieniania)
    int nt = 8;     // ilość tablic do sortowania (do zmieniania)
	
    double[][] tabele1; // tablice do sortowania jednowątkowego
    double[][] tabele2; // tablice do sortowania wielowątkowego

Należy poeksperymentować z ilością tablic (nt), a przez to ilością uruchamianych wątków drugoplanowych. Rozmiarem tablic (m) wymusza się odpowiednio długi czas pracy.

Inicjacja tabel
    private void btnInitialization_Click(object sender, EventArgs e)
    {
      Random rnd = new Random();
      tabele1 = new double[nt][];
      tabele2 = new double[nt][];
      for (int i = 0; i < nt; i++)
      {
        tabele1[i] = new double[m];
        tabele2[i] = new double[m];
        for (int j = 0; j < m; j++)
        {
          tabele1[i][j] = 100 * rnd.NextDouble();
          tabele2[i][j] = tabele1[i][j];
        }
      }
    }
Wizualizacja czasu pracy
    void showing(Label l)
    {
      l.Text = string.Format("{0} ms", (t2 - t1).TotalMilliseconds);
    }
Narzędziowa procedura sortująca tabelę przekazaną jako parametr
	    
    void sorter(double[] tab)
    {
      int n = tab.Length;
      bool bylo;
      do
      {
        bylo = false;
        for (int i = 1; i < n; i++)
          if (tab[i - 1] > tab[i])
          {
            double m = tab[i - 1];
            tab[i - 1] = tab[i];
            tab[i] = m;
            bylo = true;
          }
      } while (bylo);
    }

Sortowanie w wątku głównym
    
    private void btnSortInMainThread_Click(object sender, EventArgs e)
    {
      t1 = DateTime.Now;
      for (int i = 0; i < nt; i++)
        sorter(tabele1[i]);
      t2 = DateTime.Now;
      showing(label1);
    }
Sortowanie w wątkach drugoplanowych
    private void btnSortInMultiThread_Click(object sender, EventArgs e)
    {
      t1 = DateTime.Now;
      for (int i = 0; i < nt; i++)
      {
        Thread thr = new Thread(thrsorter);
        thr.Start(tabele2[i]);
      }
    }

    private void thrsorter(object obj)
    {
      sorter(obj as double[]);
      t2 = DateTime.Now;
      label2.Invoke( new Action(delegate(){ showing(label2); } ));
    }
Każdy wątek zapisuje czas zakończenia pracy, ale na formularzu pozostanie ostatni.