【问题标题】:ThreadPool.QueueUserWorkItem with function argument带有函数参数的 ThreadPool.QueueUserWorkItem
【发布时间】:2011-04-06 10:16:10
【问题描述】:

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

【问题讨论】:

    标签: c#


    【解决方案1】:

    使用 lambda 表达式也可以

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

    【讨论】:

    • 有没有办法在没有 lambda 表达式的情况下做到这一点?即喜欢标记的答案。所以我不必在我的方法中进行所有的对象检查和转换。
    • 不幸的是,如果没有 Lambda 表达式,我认为您无法做到这一点。 (你必须做明确的演员等)。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您应该声明一个与 WaitCallback 委托具有相同定义的方法。可以使用如下代码sn -p:

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

      【讨论】:

      • 我在这里问了另一件事,如何将匿名函数与 ThreadPool.QueueUserWorkItem 一起使用。所以我不必提及任何方法名称。如何在 c# v2.0 中做到这一点。
      • @Thomas 只是这样定义它:ThreadPool.QueueUserWorkItem(delegate(object state) { }, new object[]{2,3});
      【解决方案4】:

      在没有 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;
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多