我已经看到了一些C#方法,比如ThreadPool.QueueUserWorkItem(WaitCallback, Object),它采用了一种方法(" WaitCallback"在这种情况下),而不是提供一个选项来直接将参数传递给方法而是采用可以提供它们的单独Object
。
因此,你不能像被问here那样做。
我的问题是:为什么?
必须有技术理由使用这种方法,不允许使用
ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));
private int Multiply(int x,int y)
{
int z=(x*y);
return z;
}
答案 0 :(得分:8)
因为您想将委托传递给WaitCallBack
。简单来说,您想告诉WaitCallBack
线程必须执行的方法,但您不想现在调用该方法 。
在你的例子中
ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));
方法Multiply
将被直接调用,其结果应传递给WaitCallback
构造函数(这是不可能的)。
编译器无法决定是否要在此处调用 Multiply
,或者只是想告诉必须执行该调用的WaitCallback
,因为它将完全相同的语法。
你告诉它应该调用哪个方法方法,并且 - 分开 - 当它最终调用它时应该传递哪个参数。
但你可以改用lambda:
ThreadPool.QueueUserWorkItem(o => Multiply(2, 3));
现在线程可以执行这个lambda,而lambda又调用Multiply(2, 3)
(丢弃参数o
)。