2012-04-19 52 views
1

下面的代码是常见的:为什么必须有一个委托来桥接线程及其方法?

Work w = new Work(); 
w.Data = 42; 
threadDelegate = new ThreadStart(w.DoMoreWork); 
newThread = new Thread(threadDelegate); 
newThread.Start(); 

我只是奇怪,为什么必须是委托给线程,并在该线程上执行方法?

我们可以直接将方法名称发送给线程吗?

回答

5

我们可以直接发送方法名称给线程吗?

作为一个字符串? EWWW。如果不是字符串,你会如何建议告诉线程要执行什么?代表是在.NET中表示“用特定签名执行某些事情”的方式惯用的

请注意,您不需要使用new ThreadStart或使用单独的变量。这种方法使用组转换工作得很好:

newThread = new Thread(w.DoMoreWork); 
newThread.Start(); 

或者,如果你并不需要所有这些变量:

new Thread(new Work { Data = 42 }.DoWork).Start(); 

编辑:请注意,由于.NET 4,这是一般一个更好的主意使用Task Parallel Library这种事情。

+0

@SteveTownsend:确实是这样。将添加到答案,如果考虑到这是一个好主意:) – 2012-04-19 14:47:35

+2

顺便说一句乔恩那也没关系,有没有管理委托和C函数指针超出了类似的使用之间的关系(例如启动一个线程)?我知道委托人最有可能拥有一个内部的方法列表,因为它有'+ ='操作符,但这里还有什么可以说的吗? – Tudor 2012-04-19 15:23:39

2

委托表示数据类型,就像Integer或Double代表它们各自的数据类型一样。代表定义了一个由它们的签名(返回类型和参数)标识的函数类。就像Integer方法参数指定需要一个Integer值,委托指定具有特定签名的方法是预期的。您需要指定预期的函数类型,原因与使用基本数据类型的原因相同。当你传入你的函数时,它会传递一个指向你想调用的函数或者对象方法的指针,也就是在那个函数被定义的地方。如果你只是以一个字符串的形式传入一个函数名,它就不知道这个名字的函数在哪里;除非你以某种方式定义了包含要调用的函数定义的类。

详情参见下面的各位代表:

Info on C# delegates from Microsoft

stackoverflow question - why-do-we-need-c-sharp-delegates

以下链接是使用反射在Java调用由同名的方法的例子。正如你所看到的,你需要指定哪个类包含你想要调用的方法。委托的实际参数是直接指向方法的指针,这就是签名必须匹配的原因。

Java reflection

相关问题