尝试启动进程时发生ThreadStateException

时间:2012-07-09 16:13:02

标签: c# multithreading stack-overflow thread-state

我试图在另一个堆栈大小增加到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 个答案:

答案 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期望的那样),然后简单地用提供的参数调用我们实际想要从它的主体调用的函数。