我见过一些C#方法,比如ThreadPool.QueueUserWorkItem(WaitCallback,Object),它采用一种方法(在本例中为"WaitCallback"),而不是提供一个直接将参数传递给方法的选项,而是单独Object使用供应他们.
所以你不能做像这里被问到的事情.
我的问题是:为什么?
必须有技术上的理由使用这种方法,不允许这样的东西
ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));
private int Multiply(int x,int y)
{
int z=(x*y);
return z;
}
Run Code Online (Sandbox Code Playgroud)
因为你想传递一个委托给WaitCallBack.在简单的话,你要告诉WaitCallBack线程必须执行的方法,但你不想调用该方法现在.
在你的例子中
ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));
Run Code Online (Sandbox Code Playgroud)
该方法Multiply将被直接调用,其结果应该传递给WaitCallback构造函数(这是不可能的).
编译器无法决定是否要在此处调用 Multiply,或者只是想告诉WaitCallback必须执行该调用,因为它的语法完全相同.
那么你告诉它应该调用哪个方法方法 - 分开 - 它最终调用时应该传递哪个参数.
但你可以使用lambda代替:
ThreadPool.QueueUserWorkItem(o => Multiply(2, 3));
Run Code Online (Sandbox Code Playgroud)
现在线程可以执行这个lambda,而lambda又调用Multiply(2, 3)(丢弃参数o).