C# 将Task.Factory.StartNew与接受单个int参数的操作一起使用

C# 将Task.Factory.StartNew与接受单个int参数的操作一起使用,c#,C#,在下面的代码中,我传递了一个在StartNew外部声明的操作,看起来很好 Action ac = () => { Console.WriteLine("Executing Action in Task 7!"); }; var t7 = Task.Factory.StartNew(ac ); Task.WaitAny(t7); 但是我想向action传递一个int参数(我想在StartNew之外声明action) 您可以使用其他委托功能: Func<Action<int&

在下面的代码中,我传递了一个在StartNew外部声明的操作,看起来很好

Action ac = () => { Console.WriteLine("Executing Action in Task 7!");  };
var t7 = Task.Factory.StartNew(ac  );
Task.WaitAny(t7);
但是我想向action传递一个int参数(我想在StartNew之外声明action)


您可以使用其他委托功能:

Func<Action<int>, int, Action> createDelegate = (action, arg) =>
{
    return () => action(arg);
};
Task.Factory.StartNew(createDelegate(ac2, 2));
Func createDelegate=(操作,参数)=>
{
返回()=>操作(arg);
};
Task.Factory.StartNew(createDelegate(ac2,2));
使用
操作

Action<object> ac2 = (n) => 
{
     Console.WriteLine("Executing Action with 1 parameter = {0}", n);              
};

var t9 = Task.Factory.StartNew(ac2, 4);
动作ac2=(n)=> { WriteLine(“使用1参数={0}执行操作”,n); }; var t9=Task.Factory.StartNew(ac2,4);
对于这种情况,StartNew()方法没有重载来接受
操作
操作
。只允许
操作

您可以使用接受
对象的重载来发送
元组

        Action<int> ac2 = (n) =>
        {
            Console.WriteLine("Executing Action with 1 parameter = {0}", n);            
        };

        var _data = new Tuple<Action<int>, int>(ac2, 4);

        var t9 = Task.Factory.StartNew((obj) =>
            {
                var data = obj as Tuple<Action<int>, int>;
                data.Item1(data.Item2);
            }, _data);
动作ac2=(n)=> { WriteLine(“使用1参数={0}执行操作”,n); }; var _data=新元组(ac2,4); var t9=任务.工厂.开始新((obj)=> { var data=obj作为元组; 数据项1(数据项2); }数据);
不确定现有答案为何如此复杂:

Task.Factory.StartNew(() => ac(4));
这就是一切。只需调用包装在lambda中的函数。更好地使用
任务。同时运行

Task.Run(() => ac(4));

StartNew
能够接受另一个
对象
参数,但这是一个非常专门的API,不必要地复杂,应该很少使用。它避免了分配两个小且寿命短的对象。不要使用它。

使用
Action
而不是
Action
.Off-topic,但是通常你应该使用
Task.Run()
你可以这样做:
var t9=Task.Factory.StartNew(()=>{ac2(4);})
使用
StartNew
使用
Task非常危险。请运行
Task.Factory.StartNew(() => ac(4));
Task.Run(() => ac(4));