繁体   English   中英

使用Action创建任务<T>

[英]Create a Task with an Action<T>

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

我正在尝试创建一个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> ,然后在我的方法中将'object'转换为T.

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

你可以用

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

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

 \n  // INCORRECT代码,在运行时强制转换InvalidCastException \n  行动诉讼= DoWork; \n  任务任务=新任务((动作)动作,obj); \n 

编辑:

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

逆变意味着你可以做到

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

没有明确的铸造。

您也可以直接使用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM