【问题标题】:How to pass multiple parameter in Task如何在Task中传递多个参数
【发布时间】:2013-08-03 06:05:04
【问题描述】:

我有一个函数 GetPivotedDataTable(data, "date", "id", "flag") 以 Pivoted 格式返回数据。我想使用Task调用这个方法,但是如何在Task中传递多个参数。

【问题讨论】:

    标签: c# multithreading performance task


    【解决方案1】:

    您可以使用 lambda 表达式或 Func 来传递参数:)

    public Form1()
    {
        InitializeComponent();
    
        Task task = new Task(() => this.GetPivotedDataTable("x",DateTime.UtcNow,1,"test"));
        task.Start();
    }
    
    public void GetPivotedDataTable(string data, DateTime date, int id, string flag)
    {
        // Do stuff
    }
    

    【讨论】:

    【解决方案2】:

    如果您的参数是不同类型的,您可以使用对象数组,然后类型转换回原始类型。

    查看此控制台应用程序示例:

        static void Main(string[] args)
        {
            var param1String = "Life universe and everything";
            var param2Int = 42;
    
            var task = new Task((stateObj) =>
                {
                    var paramsArr = (object[])stateObj; // typecast back to array of object
    
                    var myParam1String = (string)paramsArr[0]; // typecast back to string 
                    var myParam2Int = (int)paramsArr[1]; // typecast back to int 
    
                    Console.WriteLine("");
                    Console.WriteLine(string.Format("{0}={1}", myParam1String, myParam2Int));
                },
                new object[] { param1String, param2Int } // package all params in an array of object
            );
    
            Console.WriteLine("Before Starting Task");
            task.Start();
            Console.WriteLine("After Starting Task");
    
            Console.ReadKey(); 
        }
    

    【讨论】:

      【解决方案3】:

      您可以创建一个 helper 类来保存您在任务中需要的所有参数。

      【讨论】:

        【解决方案4】:

        您也可以使用“参数”。检查 c# 参数信息

        public class MyClass
        {
            public static void UseParams(params int[] list)
            {
                for (int i = 0; i < list.Length; i++)
                {
                    Console.Write(list[i] + " ");
                }
                Console.WriteLine();
            }
        
            public static void UseParams2(params object[] list)
            {
                for (int i = 0; i < list.Length; i++)
                {
                    Console.Write(list[i] + " ");
                }
                Console.WriteLine();
            }
        
            static void Main()
            {
                // You can send a comma-separated list of arguments of the 
                // specified type.
                UseParams(1, 2, 3, 4);
                UseParams2(1, 'a', "test");
        
                // A params parameter accepts zero or more arguments.
                // The following calling statement displays only a blank line.
                UseParams2();
        
                // An array argument can be passed, as long as the array
                // type matches the parameter type of the method being called.
                int[] myIntArray = { 5, 6, 7, 8, 9 };
                UseParams(myIntArray);
        
                object[] myObjArray = { 2, 'b', "test", "again" };
                UseParams2(myObjArray);
        
                // The following call causes a compiler error because the object
                // array cannot be converted into an integer array.
                //UseParams(myObjArray);
        
                // The following call does not cause an error, but the entire 
                // integer array becomes the first element of the params array.
                UseParams2(myIntArray);
            }
        }
        
        
        /*
        Output:
            1 2 3 4
            1 a test
        
            5 6 7 8 9
            2 b test again
            System.Int32[]
        */
        

        【讨论】:

          【解决方案5】:

          你可以使用元组

          Task<Tuple<Tuple<Parame1,Parame2,Parame....>> Func()
          {
          
          }
          
          
          var r = await Func();
          r.Item1;
          r.Item2;
          r.Item.....
          

          【讨论】:

          • 当您回答问题时..请解释一下您的解决方案如何解决问题。
          • 这是一个有效的答案
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-21
          • 2012-06-12
          • 2019-03-21
          • 2014-09-09
          • 2015-02-17
          • 2015-06-18
          相关资源
          最近更新 更多