Just use lambda to convert to the delegate type you need:
Action<int, int, int> action = (int p1, int p2, int p3) => { // do some stuff with p1, p2 and p3. }; //a closure can capture over any values you might want to pass in Task.Run(() => action(1, 2, 3));
If you think about this, you cannot pass Action<int, int, int> to Task.Run because you also need to provide parameters. Task.Run cannot know what you want to pass.
source share