带有函数参数的ThreadPool.QueueUserWorkItem

我正在使用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中使用,请引导我使用代码。

您应该声明一个与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 }); 

使用lambda表达式也可以

 ThreadPool.QueueUserWorkItem(state => Multiply(2,3)); 

这是一个更完整的示例,它将结果返回到初始线程,并显示如何匿名定义委托:

 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; } } 

就我而言,我需要一个匿名函数。 即,异步写入流。 所以我用过这个:

 ThreadPool.QueueUserWorkItem(state => { serializer.Serialize(this.stream); this.stream.Flush(); });