2010-04-15 79 views
1

我如何将一些参数传递给从另一个类运行函数的新线程? 我想要做的是将一个数组或多个变量传递给一个函数,该函数位于另一个类中,并由新线程调用。C#4.0如何将变量传递给线程?

我试图做这样的>

Functions functions = new Functions(); 

    string[] data; 

    Thread th = new Thread(new ParameterizedThreadStart(functions.Post())); 

    th.Start(data); 

,但它显示错误“没有超载的方法‘邮报’取0参数”

任何想法?

+0

请注意,你的代码真正的问题是,你所呼叫的邮政法代替将它传递给委托构造函数。你应该省略functions.Post()之后的括号,并且这将被编译。 – Marek 2010-04-20 09:06:39

回答

9

既然你有这个标记C#4,新方法,这将是:

Functions functions = new Functions(); 

string[] data = GetData(); 

Task.Factory.StartNew(() => functions.Post(data)); 

如果你真的想离开这个使用专用线程,而不是任务并行库,能够。鉴于您的意见,这听起来像Post()可能定义为Post(string[] data)。这是行不通的,因为ParameterizedThreadStart预计方法是Post(object data)

您可以解决此通过lambda表达式,并使用ThreadStart代替ParameterizedThreadStart,然而,在不改变你的方法:

Functions functions = new Functions(); 
string[] data = GetData(); 
Thread th = new Thread(() => 
    { 
     functions.Post(data); 
    }); 
th.Start(); 
2

直接的回答是:

new Thread(new ParameterizedThreadStart(functions.Post/*(remove)*/)); 

和Functions.Post应该是这样的形式:

void Post(object state) { string[] data = (string[]) state; .... } 

如果你已经有了一个固定的void Post(string[] data)你可以添加一个包装的功能类:

void Post2(object state) { Post((string[]) state); } 

但是,当使用Fx4你应该看看任务l ibrary。

+0

现在我得到“没有过载'发布'匹配委托'System.Threading.ParameterizedThreadStart'” – Aviatrix 2010-04-15 22:21:41

+1

@Aviatrix:你可以发布你的代码(或至少sig.)的functions.Post()? – 2010-04-15 22:22:30

+0

@Aviatrix,我还在编辑一点,也许最后的版本有所帮助。但我在这里与里德,请张贴轮廓。 – 2010-04-15 22:24:05