J R B
J R B

Reputation: 2136

How to pass multiple parameter in Task

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.

Upvotes: 11

Views: 30490

Answers (5)

张静茹
张静茹

Reputation: 1

You can use Tuple

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

}


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

Upvotes: -1

Pit J
Pit J

Reputation: 179

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

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[]
*/

Upvotes: 0

Nikos Tsokos
Nikos Tsokos

Reputation: 3356

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

Upvotes: 3

Martijn van Put
Martijn van Put

Reputation: 3313

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

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
}

Upvotes: 30

user2647939
user2647939

Reputation:

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

Upvotes: 0

Related Questions