使用Action <t> </t>创建任务

时间:2012-10-24 09:18:21

标签: c# .net task-parallel-library

我不知何故觉得我遗漏了一些基本的东西。这是我的问题。

我正在尝试创建一个System.Threading.Tasks.Task实例来执行接受某种类型参数的操作。我以为我可以做像

这样的事情
void DoWork(MyClass obj) {} //My action that accepts a parameter of type 'MyClass'

MyClass obj = new MyClass(); 
Action<MyClass> action = DoWork; //action that points to the method
Task task = new Task(action,obj); //task that would execute 'DoWork' with 'obj' as the parameter when I call Start.

显然这不会编译。我似乎只能使用Action<object>而不是Action<T>作为任务,然后在我的方法中将'对象'转换为T.

如何才能最有效,最有效地实现我想要的目标?

2 个答案:

答案 0 :(得分:5)

您可以使用

Action<Object> action = o => DoWork((MyClass)o);
Task task = new Task(action, obj);

如果您使用的是.NET 4.0或更高版本,则可以使用Contravariance来实现您的目标,而无需引入新的代理

//INCORRECT Code, casts InvalidCastException at runtime
Action action = DoWork;
Task task = new Task((Action)action, obj);

修改

感谢@svick指出,第二个选项不正确:我太忙了整理,无论Action是合作还是逆变(事实上它是逆变的,至少我是对的)我是在这种情况下,我需要 Covariance

逆变法意味着你可以做到

Action<object> action1 = someAction;
Action<SubClass> action2 = action1;

没有明确的演员。

答案 1 :(得分:5)

您也可以直接使用:

MyClass obj = new MyClass();
Task task = Task.Run(() => DoWork(obj));