C# 如何在任务中传递多个参数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18029881/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 11:06:05  来源:igfitidea点击:

How to pass multiple parameter in Task

c#multithreadingperformancetask

提问by J R B

I have a function GetPivotedDataTable(data, "date", "id", "flag") is returning data in Pivoted format. I want to call this method using Task but how to pass multiple parameter in Task.

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

采纳答案by Martijn van Put

You could use lambda expression, or a Func to pass parameters:)

您可以使用 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
}

回答by J R B

You could create a helperclass that will hold all parameters that you need in your task.

您可以创建一个助手类,该类将保存您在任务中需要的所有参数。

回答by Nikos Tsokos

In case that your parameters are of diferent types you could use an array of object and then typecast back to the original types.

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

Check out this console application example:

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

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

回答by Pit J

You can use "params" also. check c# params info

您也可以使用“参数”。检查 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[]
*/

回答by u5558272

You can use Tuple

您可以使用元组

Task<Tuple<Tuple<Parame1,Parame2,Parame....>> Func()
{

}


var r = await Func();
r.Item1;
r.Item2;
r.Item.....