下面的代码很常见:
Work w = new Work();
w.Data = 42;
threadDelegate = new ThreadStart(w.DoMoreWork);
newThread = new Thread(threadDelegate);
newThread.Start();
我只是想知道,为什么必须有一个委托来桥接线程和在该线程上执行的方法?
我们可以直接将方法名称发送到 Thread 吗?
下面的代码很常见:
Work w = new Work();
w.Data = 42;
threadDelegate = new ThreadStart(w.DoMoreWork);
newThread = new Thread(threadDelegate);
newThread.Start();
我只是想知道,为什么必须有一个委托来桥接线程和在该线程上执行的方法?
我们可以直接将方法名称发送到 Thread 吗?
我们可以直接将方法名称发送到 Thread 吗?
作为字符串?万维网。如果不是作为字符串,您将如何建议告诉线程要执行什么?委托是在 .NET 中表示“使用特定签名执行的东西”的惯用方式。
请注意,您不需要使用new ThreadStart
或使用单独的变量。使用方法组转换可以正常工作:
newThread = new Thread(w.DoMoreWork);
newThread.Start();
或者,如果您不需要所有这些变量:
new Thread(new Work { Data = 42 }.DoWork).Start();
编辑:请注意,从 .NET 4 开始,将任务并行库用于此类事情通常是一个更好的主意。
委托代表一种数据类型,就像 Integer 或 Double 代表它们各自的数据类型一样。委托定义了由其签名(返回类型和参数)标识的一类函数。就像 Integer 方法参数指定期望的 Integer 值一样,委托指定期望具有特定签名的方法。您需要指定预期的函数类型,原因与使用原始数据类型的原因相同。当你传入你的函数时,它传递了一个指向你想要调用的函数或对象方法的指针,即在内存中定义该函数的位置。如果您只是将函数名称作为字符串传入,它将不知道该名称的函数在哪里;除非您以某种方式定义了包含您要调用的函数的定义的类。
有关代表的更多信息,请参阅以下内容:
stackoverflow 问题 - 为什么我们需要 c-sharp-delegates
以下链接是在 Java 中使用反射按名称调用方法的示例。如您所见,您需要指定哪个类包含您要调用的方法。委托的实际参数是直接指向方法的指针,这就是签名必须匹配的原因。