任务工厂StartNew Generic

时间:2012-08-04 18:49:13

标签: c#-4.0 generics task-parallel-library

有一种Task.Factory.StartNew(Action<Object> action, Object state)方法。这看起来很通用。但是,如果我的“行动”是

protected void Edit(MyType myType) { }

为什么我不能

MyType x = something;
Task.Factory.StartNew(Edit, x);

我明白了:

  

参数1:无法从'方法组'转换为'System.Action'

我可以通过添加另一种方法来实现它,

protected void Edit(object myType) { Edit((MyType)myType); }

或者我可以写

Task.Factory.StartNew(() => Edit(x));

但我觉得我错过了一些应该允许我以第一种方式去做的事情......

2 个答案:

答案 0 :(得分:2)

Edit方法组无法转换为Action<object>。你可以做到

Action<MyType> act = Edit;

Action<MyType>Action<object>之间没有转化。如果有你能做的话

Action<object> act = Edit;
act("abc");

答案 1 :(得分:-1)

Task.Factory.StartNew的方法签名要求单参数Action&lt;&gt;,因此只需创建一个Action&lt;&gt;实例并在您的通话中使用它:

protected void Edit( Object myType ){ ... }

MyType x = something;
Action<Object> action = new Action<Object>(Edit);
Task.Factory.StartNew( action, x );

Task.Factory.StartNew(new Action<Object>(Edit), x);

你也可以使用lambda来内联这个(你注意到了):

Task.Factory.StartNew( () => Edit(x) );