내 프로젝트에서는 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' 메소드에 대한 태스크를 일반적으로 생성하는 것입니다. –