проверь код на ошибки
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection.Emit;
using static System.Windows.Forms.AxHost;
using System.Threading;

namespace WindowsFormsApp1
{
    public delegate void ThreadCallBack(int cNN, double[] cXT, double[] cYT, double[,] cZT);

    public class ThreadWithState
    {
        private ThreadCallBack tcall;
        public int sTH;
        private double sMaxX = new double(),  // Максимальное значение аргумента Х
               sMinX = new double(),  // Минимальное значение аргумента X
               sMaxY = new double(),  // Максимальное значение функции Y
               sMinY = new double(),  // Минимальное значение функции Y
               sShagX = new double(), // Шаг изменения аргументов X
               sShagY = new double(); // Шаг изменения аргументов Y

        private double[] sXT = new double[0], // Массив аргументов X
                         sYT = new double[0]; // Массив аргументов Y

        private double[,] sZT = new double[0, 0]; // Массив значений функции

        private string FileN1 = "", // Имя файла данных
                   LineS1 = ""; // Строка данных
        private int sNN = new int(), // Размерность массивов
                I = new int(),   // Счётчик цикла
                J = new int();   // Счётчик цикла

        private StreamReader StRead1; // Объект потока ввода
        private StreamWriter StWrit1; // Объект потока вывода

        public DateTime BT1 = new DateTime(), // Время начала процесса
                        FT1 = new DateTime();  // Время окончания процесса

        public TimeSpan ST1 = new TimeSpan();  // Длительность процесса
        public ThreadWithState(int zNN, double zMinX, double zMaxX, double zMinY, double zMaxY, int zTH, ThreadCallBack tcallD)
        {
            sNN = zNN;// Размер массивов аргументов и значений функции
            sMinX = zMinX; // Минимальное значение аргумента X
            sMaxX = zMaxX; // Максимальное значение аргумента Х
            sMinY = zMinY; // Минимальное значение аргумента Y
            sMaxY = zMaxY;
            tcall = tcallD; // Создание объекта tcall из объекта tcallD
            sTH = zTH; // Номер потока
        }
        public void ThreadDoWork()
        {
            BT1 = System.DateTime.Now; // Создание объекта BT Время начала процесса класса DateTime
            sXT = new double[sNN]; // Выделение памяти для указателей
            sYT = new double[sNN]; // Выделение памяти для указателей
            sZT = new double[sNN, sNN]; // Выделение памяти для указателей
            sShagX = (sMaxX - sMinX) / (sNN - 1); // Формирование шага изменения аргумента Х
            sShagY = (sMaxY - sMinY) / (sNN - 1); // Формирование шага изменения аргумента Y
            sXT[0] = sMinX; // Первое значение в массиве аргументов Х
            sYT[0] = sMinY; // Первое значение в массиве аргументов Y
                            // Цикл для формирования массива аргументов функции
            I = 1; // Начальное значение счётчика цикла
            while (I <= sNN - 1) // Цикл по массиву аргументов
            {
                sXT[I] = sXT[I - 1] + sShagX; // Формирование элементов массива аргументов X
                sYT[I] = sYT[I - 1] + sShagY; // Формирование элементов массива аргументов Y
                I++; // Наращивание значения счётчика цикла
            } // Конец цикла while (I <= sNN - 1)
              // Цикл для вычисления функции
            I = 0; // Обнуление счётчика по массиву аргументов X
            while (I <= sNN - 1) // Цикл по массиву аргументов X
            {
                J = 0; // Обнуление счётчика столбцов
                while (J <= sNN - 1) // Цикл по массиву аргументов Y
                {
                    sZT[I, J] = 4 * Math.Sin(sXT[I]) *
                    Math.Cos(Math.Pow(sXT[I], 3)) - Math.Sin(12 * sYT[J]) *
                    Math.Cos(Math.Pow(sXT[I], 3)) - 3 * Math.Sin(4 * sYT[J])
                    * Math.Cos(Math.Pow(sXT[I], 3));
                    J++; // Наращивание значения счётчика цикла
                } // Конец цикла while (J <= sNN - 1)
                I++; // Наращивание значения счётчика цикла
            } // Конец цикла while (I <= sNN - 1)
              // Вывод результатов в файл
            FileN1 = "C://A_T.txt"; // Формирование имени файла данных
            StWrit1 = new StreamWriter(FileN1, false, System.Text.Encoding.Default); // Открытие потока StWrit1 для вывода
            LineS1 = BT1.Year.ToString() + "." + BT1.Month.ToString() + "." + BT1.Day.ToString() + ", " + BT1.Hour.ToString() + ":" + BT1.Minute.ToString() + ":" + BT1.Second.ToString() + ":" + BT1.Millisecond.ToString();
            StWrit1.WriteLine(LineS1); // Вывод строки в поток вывода
                                       // Цикл вывода данных в файл
            LineS1 = "PXT: "; // Инициализация строки
            I = 0; // Обнуление счётчика по массиву аргументов X
            while (I < sNN) // Цикл до конца массива аргументов Х
            {
                LineS1 = LineS1 + sXT[I].ToString() + "; "; // Занесение значения аргумента Х в строку
                I++; // Наращивание счётчика
            } // Конец цикла while (I < sNN)
            StWrit1.WriteLine(LineS1 + "\n"); // Вывод строки в поток вывода
                                              // Цикл вывода данных в файл
            LineS1 = "PZT: "; // Инициализация строки
            I = 0; // Обнуление счётчика строк
            while (I < sNN) // Цикл до конца массива значений функции
            {
                J = 0; // Обнуление счётчика столбцов
                while (J < sNN) // Цикл до конца массива значений функции
                {
                    LineS1 = LineS1 + sZT[I, J].ToString() + "; "; // Занесение значения функции в строку
                J++; // Наращивание счётчика
                } // Конец цикла while (J < sNN)
                StWrit1.WriteLine(LineS1); // Вывод строки в поток вывода
                LineS1 = " "; // Инициализация строки
                I++; // Наращивание счётчика строк
            } // Конец цикла while (I < sNN)
            FT1 = System.DateTime.Now; // Создание объекта FT1 Время начала процесса класса DateTime
            LineS1 = FT1.Year.ToString() + "." + FT1.Month.ToString() + "." + FT1.Day.ToString() + ", " + FT1.Hour.ToString() + ":" + FT1.Minute.ToString() + ":" + FT1.Second.ToString() + ":" + FT1.Millisecond.ToString();
            StWrit1.WriteLine(LineS1); // Вывод строки в поток вывода
            ST1 = FT1 - BT1;
            LineS1 = ST1.Hours.ToString() + ":" + ST1.Minutes.ToString() + ":" + ST1.Seconds.ToString() + ":" + ST1.Milliseconds.ToString();
            StWrit1.WriteLine(LineS1); // Вывод строки в поток вывода
            StWrit1.Close(); // Закрытие потока вывода
            tcall(sNN, sXT, sYT, sZT);
        }

    }
}