我使用的是C# 2.0,并且希望在ThreadPool.QueueUserWorkItem的帮助下调用一个带有几个参数的方法,所以我尝试了如下操作:
ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));
private int Multiply(int x,int y)
{
int z=(x*y);
return z;
}我遇到编译错误。因此,请指导我,如何使用ThreadPool.QueueUserWorkItem调用具有多个参数的函数?
我有另一个问题,当我使用ThreadPool.QueueUserWorkItem时,那么如何使用这里的匿名函数,作为结果,我可以在那里编写代码,而不是调用另一个函数。如果这在C# v2.0中是可能的,那么请用代码指导我。
发布于 2011-04-06 18:23:53
您应该声明一个与WaitCallback委托具有相同定义的方法。您可以使用以下代码片段:
ThreadPool.QueueUserWorkItem(Multiply, new object[] { 2, 3 });
public static void Multiply(object state)
{
object[] array = state as object[];
int x = Convert.ToInt32(array[0]);
int y = Convert.ToInt32(array[1]);
}匿名委派版本为:
ThreadPool.QueueUserWorkItem(delegate(object state)
{
object[] array = state as object[];
int x = Convert.ToInt32(array[0]);
int y = Convert.ToInt32(array[1]);
}
, new object[] { 2, 3 });发布于 2013-07-10 23:34:45
使用lambda表达式也可以
ThreadPool.QueueUserWorkItem(state => Multiply(2,3));发布于 2011-04-06 18:48:47
下面是一个更完整的示例,它将结果返回到初始线程,并展示了如何匿名定义委托:
class Program
{
static void Main(string[] args)
{
using (MultiplyTask task = new MultiplyTask() { Multiplicands = new int[] { 2, 3 } })
{
WaitCallback cb = new WaitCallback(delegate(object x)
{
MultiplyTask theTask = x as MultiplyTask;
theTask.Result = theTask.Multiplicands[0] * theTask.Multiplicands[1];
theTask.Set();
});
ThreadPool.QueueUserWorkItem(cb, task);
Console.WriteLine("Calculating...");
if (task.WaitOne(1000))
{
Console.WriteLine("{0} times {1} equals {2}", task.Multiplicands[0], task.Multiplicands[1], task.Result);
}
else
{
Console.WriteLine("Timed out waiting for multiplication task to finish");
}
}
}
private class MultiplyTask : EventWaitHandle
{
internal MultiplyTask() : base(false, EventResetMode.ManualReset) { }
public int[] Multiplicands;
public int Result;
}
}https://stackoverflow.com/questions/5564737
复制相似问题