1

下面的代码很常见:

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

我只是想知道,为什么必须有一个委托来桥接线程和在该线程上执行的方法?

我们可以直接将方法名称发送到 Thread 吗?

4

2 回答 2

5

我们可以直接将方法名称发送到 Thread 吗?

作为字符串?万维网。如果不是作为字符串,您将如何建议告诉线程要执行什么?委托是在 .NET 中表示“使用特定签名执行的东西”的惯用方式。

请注意,您不需要使用new ThreadStart或使用单独的变量。使用方法组转换可以正常工作:

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

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

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

编辑:请注意,从 .NET 4 开始,将任务并行库用于此类事情通常是一个更好的主意。

于 2012-04-19T14:42:51.840 回答
2

委托代表一种数据类型,就像 Integer 或 Double 代表它们各自的数据类型一样。委托定义了由其签名(返回类型和参数)标识的一类函数。就像 Integer 方法参数指定期望的 Integer 值一样,委托指定期望具有特定签名的方法。您需要指定预期的函数类型,原因与使用原始数据类型的原因相同。当你传入你的函数时,它传递了一个指向你想要调用的函数或对象方法的指针,即在内存中定义该函数的位置。如果您只是将函数名称作为字符串传入,它将不知道该名称的函数在哪里;除非您以某种方式定义了包含您要调用的函数的定义的类。

有关代表的更多信息,请参阅以下内容:

来自 Microsoft 的 C# 代表信息

stackoverflow 问题 - 为什么我们需要 c-sharp-delegates

以下链接是在 Java 中使用反射按名称调用方法的示例。如您所见,您需要指定哪个类包含您要调用的方法。委托的实际参数是直接指向方法的指针,这就是签名必须匹配的原因。

Java 反射

于 2012-04-19T15:21:06.617 回答