以下代码很常见:
Work w = new Work();
w.Data = 42;
threadDelegate = new ThreadStart(w.DoMoreWork);
newThread = new Thread(threadDelegate);
newThread.Start();
我只是想知道,为什么必须有一个委托桥接线程和方法在该线程上执行?
我们可以直接将方法名称发送给线程吗?
答案 0 :(得分: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来做这类事情。
答案 1 :(得分:2)
委托代表一种数据类型,就像Integer或Double代表它们各自的数据类型一样。委托定义了一组由其签名(返回类型和参数)标识的函数。就像Integer方法参数指定期望Integer值一样,委托指定期望具有特定签名的方法。由于与使用原始数据类型相同的原因,您需要指定预期的函数类型。传入函数时,它会传递一个指向要调用的函数或对象方法的指针,即内存中定义该函数的位置。如果你只是将一个函数名称作为字符串传入,它将不知道该名称所在的函数在哪里;除非你以某种方式定义了包含你想要调用的函数定义的类。
有关代表的更多信息,请参阅以下内容:
Info on C# delegates from Microsoft
stackoverflow question - why-do-we-need-c-sharp-delegates
以下链接是使用Java中的反射按名称调用方法的示例。如您所见,您需要指定哪个类包含您要调用的方法。委托的实际参数是直接指向方法的指针,这就是签名必须匹配的原因。