gpt4 book ai didi

c# - 一般运行任务

转载 作者:太空宇宙 更新时间:2023-11-03 22:08:15 25 4
gpt4 key购买 nike

在我的项目中,我大量使用 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();
}

到目前为止,我提出了两种不同的方法。
首先,使用匿名委托(delegate):

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为不同数量的参数实现的方法。但我不知道创建太多匿名委托(delegate)是否会导致副作用。

你更喜欢哪一个?为什么?或者你还有什么其他的解决方案?

最佳答案

好吧,您始终可以在 Action<TA,TB> 上创建扩展方法...并且您应该使用延续而不是包装的方法调用来实现在任务完成时始终执行另一个操作的行为:

public static class TaskExtensions
{
public static void RunTask<TA,TB>( Action<TA,TB> action, TA a, TB b )
{
Task newTask = new Task( () => action(a,b) );
newTask.ContinueWith( MandatoryMethod );
newTask.Start();
}

// if you need to support other signature (more parameters) you would need to
// create additional overloads of RunTask with more generic parameters...
public static void RunTask( Action action );
public static void RunTask<TA>( Action<TA> action, TA a );
// etc ...

private static void MandatoryMethod( Task t ) { /* your continuation logic */ }
}

现在您可以按如下方式使用此代码:

public void SomeMethod( int x, int y ) { ... }

// later...
Action<int,int> myAction = SomeMethod;
myAction.RunTask( 1, 2 );

请注意,在上述实现中,延续方法 ( MandatoryMethod) 将异步执行。如果您希望同步执行(如您的示例中所实现的),您可以使用 ContinueWith 的重载这需要 TaskContinuationOptions并传入 TaskContinuationOptions.ExecuteSynchronously .

关于c# - 一般运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7649601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com