我试图在另一个堆栈大小增加到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'”
我可以用哪种方式创建一个新线程来执行我的递归函数?
我应该更好地增加主线程的堆栈大小,而不是创建新线程吗?
或者我说的完全是废话,我应该继续阅读有关线程的更多信息?
提前致谢
答案 0 :(得分:3)
阅读MSDN of 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; }
}
答案 1 :(得分:2)
您可能希望使用new ParameterizedThreadStart(hueckel_operator)
安全,然后让workerThread.Start();
传递数组或列表中的参数。
答案 2 :(得分:0)
我认为你调用新线程的方式并不期望在函数中接收任何参数,因此无法找到你的函数。如果要将参数传递给新线程,则应使用对象数组并将其传递给函数。
答案 3 :(得分: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期望的那样),然后简单地用提供的参数调用我们实际想要从它的主体调用的函数。