当尝试启动一个进程时发生ThreadStateException
我想在其堆栈大小增加到10.000.000的另一个线程中运行递归函数“hueckel_operator()”。 首先,当我点击检测边缘按钮时调用hueckel_operator。所以我一直在detect_edges_click()函数创建新的线程为当尝试启动一个进程时发生ThreadStateException
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’”
在哪我可以创建一个新的线程来执行我的递归函数吗?
而不是创建一个新的线程,我应该更好地增加我的主线程的堆栈大小?
还是我说的完全是废话,我应该继续阅读更多关于线程?
在此先感谢
读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; }
}
我认为,你在呼唤你的新线程的方式并不期望接收的功能的任何参数,因此无法找到你的函数。如果你想传递参数给你的新线程,你应该使用一个对象数组并将其传递给函数。
您可能想要使用new ParameterizedThreadStart(hueckel_operator)
以保证安全,然后让workerThread.Start();
将参数传递给数组或列表。
您是否也指对象参数?'我也创建了一个值为{1,1}的数组。我应该把这个数组放在像hueckel_operator(parameterArray)这样的参数中吗? – mctuna 2012-07-09 16:49:29
@mrtcn,是的,paramterArray会起作用。实际上,任何种类的IEnumerable都可以工作,包括列表,字典,当然还有数组。即使是一个单独的班级或结构也可以工作(如果你只有一个参数,你可以将它作为自己的方式传递给一个数组)。 – 2012-07-09 16:52:21
这是因为ThreadStart
代表应该没有参数,但您的功能hueckel_operator
需要两个。
要将参数传递到您的线程功能,只需使用lambda表达式,像这样把它传递给线程构造函数:
public static void parametrized(int one, int two)
{
//perform computation
}
然后将它传递给Thread构造函数包裹在一个lambda表达式:
int arg1 = 4;
int arg2 = 2;
Thread t = new Thread(new ThreadStart(() => parametrized(arg1, arg2)));
表达式() => parametrized(arg1, arg2)
创建了一个不带参数的匿名函数(就像我们的Thread期望的那样),然后通过提供的参数简单地调用我们实际上想从它的主体调用的函数。
我已经做了所有的事情,如你所说,没有错误,但hueckel_operator()在每次counter4和counter5增加5在这种情况下,我应该以某种方式将counter4和counter5分配给param。但我不知道该怎么做 – mctuna 2012-07-09 16:46:11
@mrtcn:我建议你用两个int成员定义一个自定义类型,并用它来传递参数。我用一个例子编辑了我的答案。 – Tudor 2012-07-09 16:48:55