0

我正在尝试在堆栈大小增加到 10.000.000 的另一个线程中运行我的递归函数“hueckel_operator()”。首先,当我点击检测边缘按钮时会调用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

4 回答 4

3

阅读ThreadStart 的 MSDN,我们可以看到委托的签名是:

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; }
}
于 2012-07-09T16:31:29.107 回答
2

您可能希望使用new ParameterizedThreadStart(hueckel_operator)安全,然后workerThread.Start();将参数传递到数组或列表中。

于 2012-07-09T16:20:43.103 回答
0

我认为您调用新线程的方式并不期望在函数中接收任何参数,因此它找不到您的函数。如果要将参数传递给新线程,则应使用对象数组并将其传递给函数。

于 2012-07-09T16:16:39.910 回答
0

那是因为ThreadStart委托应该不带参数,但您的函数hueckel_operator需要两个。

要将参数传递给线程函数,只需使用 lambda 表达式将其传递给线程构造函数,如下所示:

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

然后将其传递给包装在 lambda 表达式中的 Thread 构造函数:

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

该表达式() => parametrized(arg1, arg2)创建了一个不带参数的匿名函数(就像我们的 Thread 所期望的那样),然后使用提供的参数从其主体中简单地调用我们实际想要调用的函数。

于 2012-07-09T16:30:56.667 回答