下面的代码是常见的:为什么必须有一个委托来桥接线程及其方法?
Work w = new Work();
w.Data = 42;
threadDelegate = new ThreadStart(w.DoMoreWork);
newThread = new Thread(threadDelegate);
newThread.Start();
我只是奇怪,为什么必须是委托给桥线程,并在该线程上执行方法?
我们可以直接将方法名称发送给线程吗?
下面的代码是常见的:为什么必须有一个委托来桥接线程及其方法?
Work w = new Work();
w.Data = 42;
threadDelegate = new ThreadStart(w.DoMoreWork);
newThread = new Thread(threadDelegate);
newThread.Start();
我只是奇怪,为什么必须是委托给桥线程,并在该线程上执行方法?
我们可以直接将方法名称发送给线程吗?
我们可以直接发送方法名称给线程吗?
作为一个字符串? EWWW。如果不是字符串,你会如何建议告诉线程要执行什么?代表是在.NET中表示“用特定签名执行某些事情”的方式惯用的。
请注意,您不需要使用new ThreadStart
或使用单独的变量。这种方法使用组转换工作得很好:
newThread = new Thread(w.DoMoreWork);
newThread.Start();
或者,如果你并不需要所有这些变量:
new Thread(new Work { Data = 42 }.DoWork).Start();
编辑:请注意,由于.NET 4,这是一般一个更好的主意使用Task Parallel Library这种事情。
委托表示数据类型,就像Integer或Double代表它们各自的数据类型一样。代表定义了一个由它们的签名(返回类型和参数)标识的函数类。就像Integer方法参数指定需要一个Integer值,委托指定具有特定签名的方法是预期的。您需要指定预期的函数类型,原因与使用基本数据类型的原因相同。当你传入你的函数时,它会传递一个指向你想调用的函数或者对象方法的指针,也就是在那个函数被定义的地方。如果你只是以一个字符串的形式传入一个函数名,它就不知道这个名字的函数在哪里;除非你以某种方式定义了包含要调用的函数定义的类。
详情参见下面的各位代表:
Info on C# delegates from Microsoft
stackoverflow question - why-do-we-need-c-sharp-delegates
以下链接是使用反射在Java调用由同名的方法的例子。正如你所看到的,你需要指定哪个类包含你想要调用的方法。委托的实际参数是直接指向方法的指针,这就是签名必须匹配的原因。
@SteveTownsend:确实是这样。将添加到答案,如果考虑到这是一个好主意:) – 2012-04-19 14:47:35
顺便说一句乔恩那也没关系,有没有管理委托和C函数指针超出了类似的使用之间的关系(例如启动一个线程)?我知道委托人最有可能拥有一个内部的方法列表,因为它有'+ ='操作符,但这里还有什么可以说的吗? – Tudor 2012-04-19 15:23:39