ThreadStateException возникает при попытке запуска процесса

Я пытаюсь запустить мою рекурсивную функцию "hueckel_operator()" в другом потоке, размер стека которого увеличен до 10.000.000. Во-первых, hueckel_operator вызывается, когда я нажимаю на кнопку обнаружения ребер. Таким образом, я создал новый поток в функции detect_edges_click() как

 private void detect_edges_Click(object sender, EventArgs e)
        {
             var stackSize = 20000000;
             Thread workerThread = new Thread(new ThreadStart(hueckel_operator), stackSize);                          
                workerThread.Start();

        }

public void hueckel_operator(int counter4, int counter5)
{

}

Но я получаю сообщение об ошибке: "Ошибка 22 Нет перегрузки для" hueckel_operator "соответствует делегату" System.Threading.ThreadStart ""

Каким образом я могу создать новый поток для выполнения моей рекурсивной функции?

Вместо того, чтобы создавать новый поток, я должен лучше увеличить размер стека моего основного потока?

Или я говорю чепуху, и мне следует больше читать о темах?

заранее спасибо

4 ответа

Решение

Читая MSDN ThreadStart, мы видим, что подпись делегата:

public delegate void ThreadStart()

который ваш метод не уважает, так как он принимает два параметра.

Если вы хотите передать параметры, вы можете использовать ParameterizedThreadStart, но вам все равно нужно изменить сигнатуру метода, чтобы принять один object параметр:

public void hueckel_operator(object param)
{
}

Вы могли бы тогда заключить в капсулу свои два int параметры в пользовательском типе:

class ThreadParameter
{
     public int I { get; set; }
     public int J { get; set; }
}

Вы, вероятно, хотите использовать new ParameterizedThreadStart(hueckel_operator) быть в безопасности, а затем иметь workerThread.Start(); передать параметры в массиве или списке.

Я думаю, что способ, которым вы вызываете свой новый поток, не ожидает получения каких-либо параметров в функции, и поэтому он не может найти вашу функцию. Если вы хотите передать параметры в новый поток, вы должны использовать массив объектов и передать их функции.

Это потому что ThreadStart делегат не должен принимать никаких аргументов, кроме вашей функции hueckel_operator занимает два

Чтобы передать аргументы вашей функции потока, просто передайте ее в конструктор потока, используя лямбда-выражение, например:

public static void parametrized(int one, int two)
{
    //perform computation
}

Затем передайте его конструктору Thread, заключенному в лямбда-выражение:

int arg1 = 4;
int arg2 = 2;
Thread t = new Thread(new ThreadStart(() => parametrized(arg1, arg2)));

Выражение () => parametrized(arg1, arg2) создает анонимную функцию, которая не принимает аргументов (как ожидает наш поток), а затем просто вызывает функцию, которую мы на самом деле хотим вызвать из ее тела с предоставленными аргументами.

Другие вопросы по тегам