C# 将Task.Factory.StartNew与接受单个int参数的操作一起使用
在下面的代码中,我传递了一个在StartNew外部声明的操作,看起来很好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&
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));