在我的项目中,我大量使用TPL,并决定设计一种通用的生成任务的方式,而不是明确地调用new Task(Action);
,new Task(Action<object>, object);
或Task.Factory.StartNew(Action)
等。 我将有一个功能,如运行任务一般
void SpawnTask<A,B>(Action<A,B> action, A a, B b) { ... }
void SpawnTask<A,B,C>(Action<A,B,C> action, A a, B b, C c) { ... }
创建和启动任务。
另外我需要在每个任务完成后运行强制方法。因此,我必须包装的实际方法我想在另一种方法像
void RuncTask(Action action)
{
action();
MandatoryMethod();
}
到目前为止,我想出了两种不同的方法运行。
首先,使用匿名委托:
void SpawnTask<A,B>(Action<A,B> action, A a, B b)
{
A dummyA = a; // To localize the parameters.
B dummyB = b;
var methodDelegate = delegate { action(dummyA,dummyB); };
var taskDelegate = delegate { RunTask(methodDelegate); };
Task.Factory.StartNew(taskDelegate);
}
void RuncTask(Action action)
{
action();
MandatoryMethod();
}
其次,使用元组:
void SpawnTask<A,B>(Action<A,B> action, A a, B b)
{
Tuple<Action<A,B>, A, B> tpl = Tuple.Create(action, a, b);
Action<object> act = RunTask<A,B>;
Task.Factory.StartNew(act, tpl);
}
void RuncTask<A,B>(object obj)
{
var tpl = (Tuple<Action<A, B>, A, B>)param;
tpl.Item1(tpl.Item2,tpl.Item3);
MandatoryMethod();
}
我喜欢的第一个,因为它更简单。第二个有铸造,需要其他通用的RunTask
方法来实现不同数量的参数。但我不知道创建太多匿名代表是否会导致副作用。
你更喜欢哪一个?为什么?或者你有什么其他解决方案?
也许问题不够清楚。重点是为所有类型的'void'方法一般创建一个任务。 –