14

我不知何故觉得我缺少一些基本的东西。这是我的问题。

我正在尝试创建一个 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.

显然这不会编译。似乎我只能将 anAction<object>而不是 anAction<T>用于任务,然后在我的方法中将“对象”转换为 T 。

我怎样才能最有效地实现我想要的?

4

2 回答 2

9

也可以直接使用:

MyClass obj = new MyClass();
Task task = Task.Run(() => DoWork(obj));
于 2012-10-24T10:26:28.183 回答
6

你可以使用

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

如果您使用的是 .NET 4.0 或更高版本,则可以使用逆变器来实现您的目标,而无需引入新的委托

//不正确的代码,在运行时抛出 InvalidCastException
动作动作 = DoWork;
任务task = new Task((Action)action, obj);

编辑:

感谢@svick 指出,第二个选项不正确:我太忙于整理,我监督的 Action 是协变还是逆变(实际上是逆变,至少我是对的),那在这种情况下,我需要协方差。

逆变意味着你可以做

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

没有明确的铸造。

于 2012-10-24T09:23:21.297 回答