ThreadPool.QueueUserWorkItem带有函数参数

时间:2011-04-06 10:16:11

标签: c#

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

5 个答案:

答案 0 :(得分:35)

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

答案 1 :(得分:16)

使用lambda表达式也可以

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

在我的情况下,我需要一个匿名函数。即,异步写入流。所以我用过这个:

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

答案 4 :(得分:0)

用于在没有 lambda 的情况下传递参数 - 只需将所有参数打包到一个类/对象中

MyArgumentsClass  m_MyArgumentsClass = new MyArgumentsClass();
 //fill arguments in class
 ThreadPool.QueueUserWorkItem(new WaitCallback(MyFunction), m_MyArgumentsClass);  

然后,在函数中 - 将对象转换为参数类

public void MyFunction(object msg)
{
    MyArgumentsClass  m_MyArgumentsClass = (MyArgumentsClass)msg;